我有一个函数,它接受一个文件路径参数,然后将该路径与readdir
函数和stat
函数结合使用,以打印出目录中的所有文件和目录。我遇到的问题是,当我尝试对文件和目录进行排序时,它们都被视为目录。我在这里看过类似的例子,我相信问题是我的统计格式的方式。我只是不我不明白stat是如何工作的,我甚至看过手册页,但它们没有太大意义。
下面是我的代码:
void scan(const char *dir) {
DIR *directory;
struct dirent *file;
struct stat info;
directory = opendir(dir);
if (directory == NULL) {
printf("Cannot open directory: %s\n", dir);
return;
}
while ((file = readdir(directory)) != NULL) {
if (file->d_name[0] == '.') {
// then hidden file, so leave hidden
continue;
}
if (stat(dir, &info) == -1) {
printf("can't find %s\n", file->d_name);
perror("ERROR");
}
// determine if file or directory
if (S_ISREG(info.st_mode))
printf("File: ");
if (S_ISDIR(info.st_mode))
printf("Dir: ");
// display the name of the file
printf("%s\n", file->d_name);
}
closedir(directory);
}
这是我不断得到的输出...
Dir: par_hash_table.c
Dir: BlackBoxTesting
Dir: Makefile
Dir: in3.txt
Dir: par_hash_table.o
Dir: in5.txt
Dir: par_hash_table
Dir: in4.txt
Dir: in6.txt
Dir: in1.txt
Dir: in2.txt
Dir: in8.txt
Dir: in7.txt
这是我使用的命令,我使用的是Linux,文件路径不需要如此特殊,但我只是想显示所有内容...
./par_hash_table 1 2 /home/dpb/Documents/CSE_420/P3
任何帮助我弄清楚如何区分txt文件和文件夹都会有帮助。
2条答案
按热度按时间9gm1akwq1#
将
dirent
结构中的文件名连接到路径上以使stat()
工作的替代方法是使用fstatat()
,而不是目录的文件描述符和纯文件名。另外,在某些文件系统上,
readdir()
将用文件类型填充dirent
结构的d_type
字段,因此如果是这种情况,您可以不做任何stat操作。示例(还包括对错误报告和处理的一些改进;代码的一个问题是即使函数失败也要继续并测试stat结构):
pgpifvop2#
您的错误在这里:
你每次都要为函数参数
dir
获取stat
,你想从目录条目中获取文件,所以你需要连接目录和文件名,以获取stat
的完整路径。连接部件的代码:
(顺便提一句,这是我认为使用VLA可以的极少数情况之一。如果将其转换为递归函数,请小心,确保VLA在递归调用之前超出作用域......或者仅使用
malloc
和free
以避免堆栈溢出。)另外,请通过自动格式化器运行您的代码,它也可以添加缺少的可选
{}
。为每个块使用{}
确实是一个很好的主意,即使它只是一个语句。或者,如果您没有找到C自动格式化器,您的编辑器至少应该有自动缩进,所以自己添加{}
,然后自动缩进代码。