【问题标题】:Bad results while getting file details C获取文件详细信息时结果不佳 C
【发布时间】:2013-11-12 04:55:44
【问题描述】:

我有以下函数抽象了 C 中 stat 结构的处理

int isdir(const char *filename) {
    struct stat st_buf;
    stat(filename, &st_buf);
    if(S_ISDIR(st_buf.st_mode))
       return 0;
    return 1;
}

而主函数调用isdir

int main(...) {
    struct dirent *file;
    DIR *dir = opendir(argv[1]);

    while(file = readdir(dir)) {
        printf("%d\n", isdir(file->d_name));
    }
    closedir(dir);
    /* other code */
}

我有一个名为 Test 的文件夹作为程序的参数,在两个文件中,一个是名为“archivo”的常规文件,一个是名为“carpeta”的文件夹。我的程序从文件和文件夹中打印 1 和 1,它应该是 0 和 1。我看不出错误在哪里。

终端中运行的 stat 函数给出文件和文件夹的输出。

Fichero: «archivo»
Tamaño: 0           Bloques: 0          Bloque E/S: 4096   fichero regular
Dispositivo: 805h/2053d Nodo-i: 3159580     Enlaces: 1
Acceso: (0664/-rw-rw-r--)  Uid: ( 1000/alejandro)   Gid: ( 1000/alejandro)
Acceso: 2013-10-31 21:08:57.556446728 -0300
Modificación: 2013-10-31 21:08:57.556446728 -0300
  Cambio: 2013-10-31 21:08:57.556446728 -0300
Creación: -

Fichero: «carpeta/»
Tamaño: 4096        Bloques: 8          Bloque E/S: 4096   directorio
Dispositivo: 805h/2053d Nodo-i: 3147783     Enlaces: 2
Acceso: (0775/drwxrwxr-x)  Uid: ( 1000/alejandro)   Gid: ( 1000/alejandro)
Acceso: 2013-10-31 21:19:11.728526599 -0300
Modificación: 2013-10-31 21:19:20.867833586 -0300
Cambio: 2013-10-31 21:19:20.867833586 -0300
Creación: -

【问题讨论】:

  • 你检查stat的返回值了吗?

标签: c file file-permissions


【解决方案1】:

问题是file->d_name 只是一个文件名,它不包括目录路径。所以isdir() 是在当前目录中查找文件,而不是argv[1] 中命名的目录。您需要将目录传递给isdir(),然后在调用stat() 之前用/ 分隔符连接目录和文件名。

int isdir(const char *dirname, const char *filename) {
    struct stat st_buf;
    char *fullname = malloc(strlen(dirname)+strlen(filename)+2); // +2 for the slash and trailing null
    strcpy(fullname, dirname);
    strcat(fullname, "/");
    strcat(fullname, filename);
    if (stat(fullname, &st_buf) == -1) {
        perror(fullname);
        free(fullname);
        return 0;
    }
    free(fullname);
    return !S_ISDIR(st_buf.st_mode);
}

那你应该叫它:

isdir(argv[1], file->d_name));

【讨论】:

  • 很好的答案,我正在用我的头脑在一个文件夹上编程,但代码在那里不起作用哈哈。当您编辑答案时,我使用 strcpy 和 strcat 重新制作了非常接近的函数。
【解决方案2】:

另一个问题是您调用 readdir 两次,一次在您的 while () 构造中,然后一次。它报告隐藏目录的数据。和...

【讨论】:

  • 天哪,翻译问题,我试着翻译代码,没用,我会解决的,但是谢谢,在这种情况下你也是对的。
【解决方案3】:

stat 很可能失败了。试试看:

 if( -1 == stat(filename, &st_buf)) {
   perror( filename );
   return 0;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多