gpt4 book ai didi

c - C中的递归子目录处理

转载 作者:行者123 更新时间:2023-11-30 17:37:51 24 4
gpt4 key购买 nike

好的,所以我正在尝试处理目录及其中的文件列表。到目前为止,我的程序运行良好,除了碰巧有超过给定目录中的 1 个子目录。我绝对无法弄清楚为什么会发生这种情况。

下面是我正在使用的相关代码片段。任何帮助将不胜感激。

    int i=0;
int subcount=0;
char temp[256];
struct dirent *directory;
DIR *pdirectory;
struct stat fileinfo;

chdir(path);
pdirectory=opendir(path);
if (pdirectory==NULL)
{
perror(path);
exit(EXIT_FAILURE);
}
printf("%s\n",path);
while ((directory=readdir(pdirectory)) != NULL)
{

if (!stat(directory->d_name,&fileinfo))
{

if(!strcmp(directory->d_name,"."))
continue;
if(!strcmp(directory->d_name,".."))
continue;

if (S_ISDIR(fileinfo.st_mode) && (!S_ISREG(fileinfo.st_mode)))
{
(char*)directory->d_name;
strcpy(temp,directory->d_name);
printf("Dir Name: %s\n",temp);
subcount=subcount+1;
printf("Sub Count: %d\n",subcount);


for (i=0; i < subcount; i++)
{
strcat(path,"/");
strcat(path,temp);
processDir(path); //Recursive Call to Function

}
closedir(pdirectory);
}

最佳答案

函数声明未显示,但看起来可能类似于

void processDir(char *path);

path 不应被假定为具有用于附加附加 char 的空间,不幸的是,这就是

发生的情况
strcat(path,"/");
strcat(path, temp);

此外,如果还有另一个子目录,则不会恢复path,而是附加下一个子目录名称(@doukremt)。相反,请使用工作区缓冲区。顺便说一句:不需要 temp

char buffer[1024];
sprintf(buffer, "%s/%s", path, directory->d_name);
processDir(buffer); //Recursive Call to Function

稍后:
您希望使用 snprintf() 来确保缓冲区不会溢出并采取规避操作。
简化:int len = sprintf(buffer, "%s/", path); 在循环之前,然后简单地:

strcpy(&buffer[len], directory->d_name);
processDir(buffer); //Recursive Call to Function

再次添加防止/检测缓冲区溢出代码。

<小时/>

可选方法:如果是 C99 或更高版本,则使用 VLA

char buffer[strlen(path) + 1 + sizeof(directory->d_name) + 1];

或使用动态内存分配。

size_t size = strlen(path) + 1 + sizeof(directory->d_name) + 1;
char *buffer = malloc(size); // TDB add NULL check
len = sprintf(buffer, "%s/", path);`
while ((directory=readdir(pdirectory)) != NULL) {
...
strcpy(&buffer[len], directory->d_name);
processDir(buffer);
...
}
free(buffer);

关于c - C中的递归子目录处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22276520/

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