我有这个使用readdir()的函数。我使用stat()来获取有关我作为参数提供的目录中的文件的信息。
folder_name []实际上是我想要阅读的目录的绝对路径
该功能适用于.
或./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);
.......
}
}
答案 0 :(得分:0)
你正在通过计算机的记忆踩踏沉重的靴子,所以你得到了未定义的行为。
这部分
char *temp;
temp = (char*) malloc (sizeof(char));
temp[0] = 0;
sprintf(temp,"%s/%s",folder_name,dirread->d_name);
每个sizeof(char)
只分配1个字节的内存,但接下来你要做的就是将 way 更长的字符串写入其中。
您需要分配更多 - 至少与文件夹路径的长度,分隔符以及最大允许的文件名长度一样多。有一些常量,例如你可以使用MAX_FILE_PATH
,但这些常量与编译器和系统有关;我经常使用一些东西"肯定足够大,咳嗽咳嗽"例如1024
。
但是我不清楚为什么你在循环中分配那个内存。 (主要是因为你不能在任何地方释放它,所以我不知道预期的范围。)你可以在你的循环之前做到这一点,然后你也可以使用
char temp[1024];
而不是动态分配。