gpt4 book ai didi

检查目录路径以 "."、 ".."结尾

转载 作者:太空宇宙 更新时间:2023-11-04 10:31:12 28 4
gpt4 key购买 nike

我有一个编程问题,希望有人能帮我解决。我正在尝试为一项工作任务学习 C 编程,我为自己设定了一个小项目,其中包括读取文件树,其中包括获取有关每个文件的信息的所有子目录。

我遇到的问题是我的程序不会忽略以/结尾的目录路径。或/.. 当它打印所有目录时,我想在子目录前留出空间以提高可读性。

所以错误发生在这部分:

int isDir(const char *parent, char *name) {

struct stat st_buf; // file info
char buf[BUF_SIZE];

if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
return 0;
}
char *path = malloc(strlen(name) + strlen(parent) + 2);
//sprintf(char *buf, const char *format, [arg1],[arg2],...)
sprintf(path, "%s/%s", parent, name);
stat(path, &st_buf); //

return S_ISDIR(st_buf.st_mode); //directory
}

这是主函数和列表函数:

int list(const char *name) {
DIR *dirp = opendir(name);
struct dirent *dentry;
char buf[BUF_SIZE];

while ((dentry = readdir(dirp)) != NULL) {
char *dir_name = dentry->d_name;

printf(" %s\n", dir_name);

//if it's dir, then go into dir
if (isDir(name, dir_name)) { //name : parent, dir_name : child
chdir(dir_name);
getcwd(buf, BUF_SIZE);
list(buf);
}
}
closedir(dirp);
}

int main()
{
list(".");
return 0;
}

结果是这样的:

hm1.c
Data
lab1.txt
result1
lab3.txt
.
..
.
..
result2
lab3.txt
.
..
result3
lab3.txt
.
..
a.c
.
..
a.out

结果我要打印

hm1.c
Data
lab1.txt
result1
lab3.txt
result2
lab3.txt
result3
lab3.txt
a.c
a.out

最佳答案

如果你有 . oe ..,你的 isDir 返回 true/false,它返回 false(或零),然后是 true/其他情况下 S_ISDIR 的 false 值

您真正需要的是返回 SKIP、isFILE 或 isDIR 三个值之一的函数,然后根据它编写您的打印逻辑。

您还需要修复内存泄漏

另请注意,chdir(dir_name); 会更改进程的实际目录,因此一旦您在循环中从list 返回,您将无法再打开您正在循环的文件或目录(因为您现在位于不同的目录中)

这将解决您的问题并打印您想要的格式

enum { doSkip, isFile, isDir } testDir(char *path, char *name) 
{
struct stat st_buf;
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
return doSkip;
}
stat(path, &st_buf);
if (S_ISDIR(st_buf.st_mode))
return isDir;
return isFile;
}

void list(const char *path, int indentlevel)
{
DIR *dirp = opendir(path);
struct dirent *dentry;
char buf[10000]; // Lets just make the buffer sufficently big for this example
if (!dirp) {
printf("%*sNo access\n",indentlevel,"");
return;
}

while ((dentry = readdir(dirp)) != NULL) {

sprintf(buf,"%s/%s", path, dentry->d_name);
switch (testDir(buf,dentry->d_name)) {
case doSkip:
/* do nothing */
break;
case isDir:
printf("%*s%s:\n",indentlevel,"",dentry->d_name);
list(buf,indentlevel+4);
break;
case isFile:
printf("%*s%s\n",indentlevel,"",dentry->d_name);
break;
}
}
closedir(dirp);
}

int main()
{
list(".", 0);
return 0;
}

关于检查目录路径以 "."、 ".."结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39809879/

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