gpt4 book ai didi

c - readdir() 对于子目录无法正常工作

转载 作者:行者123 更新时间:2023-11-30 17:23:18 29 4
gpt4 key购买 nike

我有一个使用 readdir() 的函数。我使用 stat() 来获取有关我作为参数提供的目录中的文件的信息。

folder_name[] is actually the absolute path for the directory I want to read

该函数对于 ../lfac 等名称可以正常工作,但对于 ./lfac/comp 等名称则无法正常工作>。我对其进行了测试,它从该目录中读取了一些文件,但不是全部。可执行文件放置在根目录中。

我有另一个函数(递归函数),它也使用 readdir() 并存储一个列表,其中包含目录(我作为参数给出)及其子目录中文件的绝对路径。这个函数也有同样的问题。

void content(char folder_name[], char *answer)
{
DIR *diropen;
struct dirent *dirread;

if ((diropen = opendir(folder_name)) == NULL)
{
printf ("Error opening directory %s\n",folder_name);
exit(EXIT_FAILURE);
}

while ((dirread = readdir (diropen)) != NULL)
{
struct stat sb;
memset(&sb, 0, sizeof sb);
char *temp;
temp = (char*) malloc (sizeof(char));
temp[0] = 0;
sprintf(temp,"%s/%s",folder_name,dirread->d_name);
if(strcmp(dirread->d_name,".")==0 || strcmp(dirread->d_name,".")==0)
continue;
if (stat(temp, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}

strcat(answer,"File name: ");
strcat(answer,dirread->d_name);
strcat(answer,"\n");
strcat(answer,"File type: ");
switch (sb.st_mode & S_IFMT) {
case S_IFBLK: strcat(answer,"block device\n"); break;
case S_IFCHR: strcat(answer,"character device\n"); break;
case S_IFDIR: strcat(answer,"directory\n"); break;
case S_IFIFO: strcat(answer,"FIFO/pipe\n"); break;
case S_IFLNK: strcat(answer,"symlink\n"); break;
case S_IFREG: strcat(answer,"regular file\n"); break;
case S_IFSOCK: strcat(answer,"socket\n"); break;
default: strcat(answer,"unknown?\n"); break;
}
sprintf(temp,"I-node number: %ld\n", (long) sb.st_ino); strcat(answer,temp);
.......
}
}

最佳答案

您正在用沉重的 Boot 践踏计算机的内存,因此您会遇到未定义的行为。

这部分

char *temp;
temp = (char*) malloc (sizeof(char));
temp[0] = 0;
sprintf(temp,"%s/%s",folder_name,dirread->d_name);

每个sizeof(char)仅分配1个字节的内存,但您接下来要做的就是向其中写入更长的字符串。

您需要分配更多的空间——至少与文件夹路径的长度一样多,加上分隔符,加上允许的最大文件名长度。您可以使用一些常量,例如 MAX_FILE_PATH ,但这些常量取决于编译器和系统;我通常使用“肯定足够大,咳咳”的东西,例如1024

不过,我不太清楚为什么要在循环中分配该内存。 (主要是因为你没有在任何地方释放它,所以我不知道预期的范围。)你可以在循环之前执行此操作,然后你不妨使用

char temp[1024];

而不是动态分配。

关于c - readdir() 对于子目录无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27657504/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com