获取文件详细信息C时结果不佳

时间:2013-11-01 00:51:35

标签: c file file-permissions

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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