Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列出目录并显示每个文件的详细信息。使用c的所有者、八进制权限和文件名_C_Dir_Stat_Opendir_Owner - Fatal编程技术网

列出目录并显示每个文件的详细信息。使用c的所有者、八进制权限和文件名

列出目录并显示每个文件的详细信息。使用c的所有者、八进制权限和文件名,c,dir,stat,opendir,owner,C,Dir,Stat,Opendir,Owner,我正在尝试创建一个方法来执行一些系统调用。它应该显示每个文件的所有者和八进制代码。但不知怎的,我走不动了。它将登录的用户名显示为每个文件的所有者 listContents(char * dir) { struct dirent *direntp; DIR *dirp; if ((dirp = opendir(dir) ) == NULL) { perror ("Failed to open directory"); return 1;

我正在尝试创建一个方法来执行一些系统调用。它应该显示每个文件的所有者和八进制代码。但不知怎的,我走不动了。它将登录的用户名显示为每个文件的所有者

listContents(char * dir) {

    struct dirent *direntp;
    DIR *dirp;

    if ((dirp = opendir(dir) ) == NULL) 
    {
      perror ("Failed to open directory");
      return 1;
    }

    while((direntp=readdir(dirp))!=NULL) {
        struct stat fileInfo;
        if (stat(direntp->d_name, &fileInfo) == 0);
        {
            struct passwd * pInfo = getpwuid(fileInfo.st_uid);
            if(pInfo!=NULL)
            {
                printf("owner is : %s\toctal permisions is: %o\n", pInfo->pw_name, fileInfo.st_mode);
            }
        }
    }

    while ((closedir(dirp) == -1) && (errno == EINTR)) ;

    return 0;
}
您有一个错误:

if (stat(direntp->d_name, &fileInfo) == 0); {
应该是

if (stat(direntp->d_name, &fileInfo) == 0) {
但您的版本将只在当前目录下工作,因为您使用的第一个参数应该是文件的整个路径,而不仅仅是名称。 我添加了一点修改后的代码:

list_contents (char *dir) {
    struct dirent *direntp;
    DIR *dirp;
    char path[PATH_MAX + 1];
    char fpath[PATH_MAX + 1];

    if ((dirp = opendir(dir)) == NULL) {
        perror ("Failed to open directory");
        return 1;
    }

    strcpy(path, dir);
    strcat(path, "/");

    while (NULL != (direntp = readdir(dirp))) {
        struct stat fileInfo;
        strcpy(fpath, path);
        strcat(fpath, direntp->d_name);

        if (stat(fpath, &fileInfo) == 0) {
            struct passwd * pInfo = getpwuid(fileInfo.st_uid);
            if(pInfo != NULL) {
                printf("%s - owner is : %s\toctal permisions are: %o\n", direntp->d_name, pInfo->pw_name, fileInfo.st_mode);
            }
        }
    }

    closedir(dirp); // edited as chux proposed

    return 0;
}

我试着给你修压痕,但完全弄丢了。请你自己更正。它是正确的所有者。但是我认为您需要编写
fileInfo.st_模式&0777
而不是
fileInfo.st_模式
来只显示权限。潜在无限循环
while((closedir(dirp)=-1)和&(errno==EINTR))只需使用
closedir(dirp)次要:“八进制权限为”-->“八进制权限为”。