gpt4 book ai didi

c - 如何在递归函数中跟踪文件路径名?

转载 作者:行者123 更新时间:2023-11-30 19:01:04 26 4
gpt4 key购买 nike

我目前有一个函数可以遍历目录并打印每个目录中的每个文件。

void printdir(char *dir, int depth)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if ((dp = opendir(dir))==NULL)
{
fprintf(stderr, "cannot open director: %s\n", dir);
return;
}
chdir(dir);
while((entry = readdir(dp))!=NULL)
{
lstat(entry->d_name, &statbuf);
if(S_ISDIR(statbuf.st_mode))
{
if(strcmp(".", entry ->d_name)==0 || strcmp("..", entry->d_name) ==0)
continue;
printf("directory %*s%s/\n", depth, "", entry->d_name);
printdir(entry->d_name, depth+4, path);

}
else printf("file %*s/%s\n", depth, "",entry->d_name);
}
chdir("..");
closedir(dp);
}

我需要跟踪整个路径名。我最初是通过使用 malloc 字符串来做到这一点的

char *path = malloc(sizeof(char)*500); 

然后我将原始文件名(从用户处获得)strcat 到路径。然后我将路径设置为参数,因此每当我打开新目录时,我都会将名称添加到路径中。唯一的问题是,我不知道何时“重置”路径是否有意义。因此,如果我有目录 A 和目录 B、C、D,当我离开目录 B 时,我需要将路径重置为“./directoryA”,然后添加目录 C。基本上如果有人可以查看我的代码并看看是否有一种编辑它的方法,以便我可以跟踪文件名,这将非常有帮助!谢谢!

最佳答案

堆栈是你的 friend ,使用它。
下面的示例使用堆栈作为保留您所在位置的引用的方法。
printdirdir 参数现在是一个副本。
另外 - 由于您现在拥有完整路径,因此您不再需要chdir
最后,添加了goto bail,而不是在出错时返回以释放目录句柄。

#define _POSIX_C_SOURCE 1
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <alloca.h>
#include <limits.h>

void printdir(char *dir, int depth)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if ((dp = opendir(dir))==NULL)
{
fprintf(stderr, "cannot open director: %s\n", dir);
goto bail;
}
//chdir(dir);
while((entry = readdir(dp))!=NULL)
{
size_t dir_len = strlen(dir);
size_t name_len = strlen(entry->d_name);
char* child = (char*)alloca((dir_len + name_len + 1 /* our added '/' */ + 1 /* null termination */) * sizeof(char));
if (child == NULL){
fprintf(stderr,"out of stack memory");
goto bail;
}
// Copy the current dir + new directory to 'child'.
// Could use strcpy and then strcat instead
memcpy(child,dir,dir_len);
child[dir_len] = '/';
memcpy(child + dir_len + 1,entry->d_name,name_len);
child[dir_len + 1 + name_len] = '\0';

lstat(child, &statbuf);
if(S_ISDIR(statbuf.st_mode))
{
if(strcmp(".", entry ->d_name)==0 || strcmp("..", entry->d_name) ==0)
continue;
printf("directory %*s%s/\n", depth, "", child);
printdir(child, depth+4);
}
else printf("file %*s/%s\n", depth, "",child);
}
//chdir("..");

bail:
if (dp){
closedir(dp);
}
}

int main(int argc,char** argv){
char* path = ".";
printdir(path,0);
return 0;
}

关于c - 如何在递归函数中跟踪文件路径名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58535088/

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