如何在 C 中使用 dirent header 扫描文件夹中的文本
how to scan a text in a folder using dirent header in C
我需要找到一种扫描文件夹的方法-(例如 -C:\Users\User\Documents\HW)并检查是否有一些我从用户那里得到的文本。我需要 return 哪些文件具有完全相同的文本。我以前从未使用过 dirent.h,我不知道如何使用它;
您定义自己的 error
处理错误的函数:
// Standard error function
void fatal_error(const char* message) {
perror(message);
exit(1);
}
遍历功能主要是stat当前文件,如果那个文件是目录,我们就进入那个目录。在目录本身非常重要的是检查当前目录是否是 .或 .. 因为这会导致无限循环。
void traverse(const char *pathName){
/* Fetching file info */
struct stat buffer;
if(stat(pathName, &buffer) == -1)
fatalError("Stat error\n");
/* Check if current file is regular, if it is regular, this is where you
will see if your files are identical. Figure out way to do this! I'm
leaving this part for you.
*/
/* However, If it is directory */
if((buffer.st_mode & S_IFMT) == S_IFDIR){
/* We are opening directory */
DIR *directory = opendir(pathName);
if(directory == NULL)
fatalError("Opening directory error\n");
/* Reading every entry from directory */
struct dirent *entry;
char *newPath = NULL;
while((entry = readdir(directory)) != NULL){
/* If file name is not . or .. */
if(strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){
/* Reallocating space for new path */
char *tmp = realloc(newPath, strlen(pathName) + strlen(entry->d_name) + 2);
if(tmp == NULL)
fatalError("Realloc error\n");
newPath = tmp;
/* Creating new path as: old_path/file_name */
strcpy(newPath, pathName);
strcat(newPath, "/");
strcat(newPath, entry->d_name);
/* Recursive function call */
traverse(newPath);
}
}
/* Since we always reallocate space, this is one memory location, so we free that memory*/
free(newPath);
if(closedir(directory) == -1)
fatalError("Closing directory error\n");
}
}
您也可以使用 chdir()
函数来执行此操作,那样可能更容易,但我想向您展示这种方式,因为它非常具有说明性。但遍历 folder/file 层次结构的最简单方法是 NFTW
函数。请务必检查 man
页。
如果您还有其他问题,请随时提出。
我需要找到一种扫描文件夹的方法-(例如 -C:\Users\User\Documents\HW)并检查是否有一些我从用户那里得到的文本。我需要 return 哪些文件具有完全相同的文本。我以前从未使用过 dirent.h,我不知道如何使用它;
您定义自己的 error
处理错误的函数:
// Standard error function
void fatal_error(const char* message) {
perror(message);
exit(1);
}
遍历功能主要是stat当前文件,如果那个文件是目录,我们就进入那个目录。在目录本身非常重要的是检查当前目录是否是 .或 .. 因为这会导致无限循环。
void traverse(const char *pathName){
/* Fetching file info */
struct stat buffer;
if(stat(pathName, &buffer) == -1)
fatalError("Stat error\n");
/* Check if current file is regular, if it is regular, this is where you
will see if your files are identical. Figure out way to do this! I'm
leaving this part for you.
*/
/* However, If it is directory */
if((buffer.st_mode & S_IFMT) == S_IFDIR){
/* We are opening directory */
DIR *directory = opendir(pathName);
if(directory == NULL)
fatalError("Opening directory error\n");
/* Reading every entry from directory */
struct dirent *entry;
char *newPath = NULL;
while((entry = readdir(directory)) != NULL){
/* If file name is not . or .. */
if(strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){
/* Reallocating space for new path */
char *tmp = realloc(newPath, strlen(pathName) + strlen(entry->d_name) + 2);
if(tmp == NULL)
fatalError("Realloc error\n");
newPath = tmp;
/* Creating new path as: old_path/file_name */
strcpy(newPath, pathName);
strcat(newPath, "/");
strcat(newPath, entry->d_name);
/* Recursive function call */
traverse(newPath);
}
}
/* Since we always reallocate space, this is one memory location, so we free that memory*/
free(newPath);
if(closedir(directory) == -1)
fatalError("Closing directory error\n");
}
}
您也可以使用 chdir()
函数来执行此操作,那样可能更容易,但我想向您展示这种方式,因为它非常具有说明性。但遍历 folder/file 层次结构的最简单方法是 NFTW
函数。请务必检查 man
页。
如果您还有其他问题,请随时提出。