gpt4 book ai didi

c - 搜索目录以查看 C 中是否存在文件

转载 作者:行者123 更新时间:2023-11-30 19:41:02 25 4
gpt4 key购买 nike

我试图在执行我的程序时由用户在命令行上指定的目录中搜索文件。它应该查看指定的目录,并检查该目录中的子目录并递归搜索文件。

我在这里有打印语句,试图分析正在传递的变量以及它们如何变化。在我的 while 循环中,它永远不会检查它是否是一个文件或只是表明未找到它的 else 语句。每次检查是否为目录都是 true,但显然不是这样。

感谢您的帮助。我对 dirent 和 stat 不是很熟悉/不适应,所以我一直在尝试检查并确保我同时正确使用它们。

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>

void traverse(char *dir, char *file) {

DIR *directory;
struct dirent *structure;
struct stat info;

printf("Current directory to search through is: %s\n", dir);
printf("Current file to search for is: %s\n", file);
printf("\n");
printf("\n");

// make sure the directory can be opened
if((directory = opendir(dir)) == NULL) {
fprintf(stderr, "The directory could not be opened. %s\n", strerror(errno));
return;
}

chdir(dir); // change to the directory

while((structure = readdir(directory)) != NULL) { // loop through it
fprintf(stderr, "before the change it is: %s\n", dir);
lstat(structure->d_name, &info); // get the name of the next item

if(S_ISDIR(info.st_mode)) { // is it a directory?
printf("checking if it's a directory\n");
if(strcmp(".", structure->d_name) == 0 ||
strcmp("..", structure->d_name) == 0)
continue; // ignore the . and .. directories
dir = structure->d_name;
fprintf(stderr, "after the change it is: %s\n", dir);
printf("About to recurse...\n");
printf("\n");
traverse(structure->d_name, file); // recursively traverse through that directory as well
}

else if(S_ISREG(info.st_mode)) { // is it a file?
printf("checking if it's a file\n");
if(strcmp(file, structure->d_name) == 0) { // is it what they're searching for?
printf("The file was found.\n");
}
}

else {
printf("The file was nout found.\n");
}
}
closedir(directory);
}

int main(int argc, char *argv[]) {

// make sure they entered enough arguments
if (argc < 3) {
fprintf(stderr, "You didn't enter enough arguments on the command line!\n");
return 3;
}

traverse(argv[2], argv[1]);

}

最佳答案

有一个 POSIX 函数可以用于像这样的树遍历。它被称为nftw()

它提供了回调机制,还可以检测由错误构建的符号链接(symbolic link)引起的链接。

所以我建议您使用它,而不是您正在做的方式。

像往常一样man nftw将详细解释它的操作。标准的 Linux/Unix 包含文件是 ftw.h。

请注意,它们是一个名为 ftw() 的函数,该函数现在显然已过时。

关于c - 搜索目录以查看 C 中是否存在文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34056457/

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