我有以下函数来抽象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: -
答案 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两次,之后调用一次。它报告隐藏目录的数据。和......