1

我有以下函数抽象了 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: -
4

3 回答 3

3

问题是这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));
于 2013-11-01T01:02:21.517 回答
1

很可能stat是失败了。尝试检查:

 if( -1 == stat(filename, &st_buf)) {
   perror( filename );
   return 0;
 }
于 2013-11-01T00:59:51.073 回答
0

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

于 2013-11-01T01:20:20.117 回答