我目前正在构建一些遍历所有文件和路径以及文件大小的Directorys代码。我现在卡在遍历过程的最后一部分,这是使代码进入任何遇到的目录的if语句。
do {
char *filename = entry->d_name;
stat(filename,&buffer);
if (S_ISDIR(buffer.st_mode)) {
name = entry->d_name;
chdir(name);
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
listdir(name); //THIS IS THE NAME OF THE FUNCTION THAT THIS SNIPPET IT FROM!
chdir("..");
}
else
printf("%s\t%d\n", entry->d_name,buffer.st_size);
我很困惑,试图让它进入它遇到的目录!哎呀!
答案 0 :(得分:1)
问题是,当我执行时,stat()
失败了。
这对我有用:
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
void listdir(const char* const name);
int main(void)
{
listdir(getenv("PWD"));
return 0;
}
void listdir(const char* const name)
{
DIR *dir;
struct dirent *entry;
struct stat buffer;
char* path = 0;
if (!(dir = opendir(name)))
return;
if (!(entry = readdir(dir)))
return;
do {
path =
malloc((strlen(name) + strlen(entry->d_name) + 2) * sizeof(char));
sprintf(path, "%s/%s", name, entry->d_name);
if (-1 == stat(path,&buffer))
{
fprintf(stderr, "stat(%s) failed: %s\n",
path, strerror(errno));
exit(1);
}
else if (S_ISDIR(buffer.st_mode))
{
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0)
{
listdir(path);
}
}
else
{
printf("%s\t%d\n", path, buffer.st_size);
}
free(path);
} while (entry = readdir(dir));
closedir(dir);
}
编辑:
删除了对chdir()
的调用,因为意识到它是多余的。这确实提供了列表,但没有使用chdir()
。
答案 1 :(得分:0)
首先,您应该使用lstat
。其次,通过chdir(name)
来电,您实际上做进入父指令(当名称=&#34; ..&#34;)时,但永远不会退缩。
答案 2 :(得分:0)
问题在于此代码:
if (S_ISDIR(buffer.st_mode)) {
name = entry->d_name;
chdir(name);
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
listdir(name); //THIS IS THE NAME OF THE FUNCTION THAT THIS SNIPPET IT FROM!
chdir("..");
}
这是嵌入在do-while循环中,但是你没有告诉我们如何读取目录条目。
在执行strcmp()
之前,chdir()
条件应该应用于当前目录;这是一个“危险”的行动。当您确定需要处理目录时,可以执行chdir()
,打开新的目录流,并处理新流中的条目 - 这可能是递归调用,然后是{{1} } 再次回来。完成chdir()
之后的跳跃(因为在执行chdir(..)
之前没有检查..
)会对事情造成严重破坏。
你应该查找chdir(name)
,这可能会更好,以便回到你开始的地方。