列出目录中的所有文件和子目录的C程序
在C语言中,可以使用一些系统调用函数来列出给定目录中的所有文件和子目录。在本篇文章中,我们将介绍如何使用这些函数来编写一个可以列出目录中所有文件和子目录的程序。
准备工作
在开始编写程序之前,我们需要先了解一些系统调用函数,这些函数在头文件<dirent.h>
中定义。其中最常用的函数包括:
opendir()
:打开目录,返回一个DIR*
类型的指针。
readdir()
:读取目录中的文件和子目录,返回一个struct dirent*
类型的指针。
closedir()
:关闭目录。
我们还需要定义一个递归函数来遍历所有子目录。这个函数将会调用自己来遍历子目录,直到目录中没有子目录为止。
实现程序
现在,让我们开始编写程序吧!首先,我们需要写一个listdir()
函数,这个函数将会列出指定目录中的所有文件和子目录:
void listdir(const char *path) {
struct dirent *entry;
DIR *dp;
dp = opendir(path);
if (dp == NULL) {
perror("opendir");
return;
}
while ((entry = readdir(dp)) != NULL) {
if (entry->d_type == DT_DIR) {
/* Found a directory */
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
/* Print directory name */
printf("%s/%s\n", path, entry->d_name);
/* Recurse at a new indent level */
char *subdir;
asprintf(&subdir, "%s/%s", path, entry->d_name);
listdir(subdir);
free(subdir);
} else {
/* Print file name */
printf("%s/%s\n", path, entry->d_name);
}
}
closedir(dp);
}
首先,我们使用opendir(path)
函数打开目录。
如果打开目录失败,将会输出一个错误信息并退出程序。
然后,我们使用readdir(dp)
函数读取目录中的所有文件和子目录。
如果读取到的是子目录,则打印目录名,并使用递归调用listdir()
函数来遍历子目录。
如果读取到的是文件,则打印文件名。
最后,我们使用closedir(dp)
函数关闭目录。
现在,我们需要写一个main()
函数来测试这个listdir()
函数。在这个函数中,我们将会调用listdir()
函数,并将目录名作为参数传递给它。
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <directory name>\n", argv[0]);
return 1;
}
listdir(argv[1]);
return 0;
}
首先,我们检查命令行参数是否正确。
如果参数不正确,将会输出一个用法信息并退出程序。
然后,我们调用listdir()
函数,并将目录名作为参数传递给它。
最后,程序将会返回0。
运行程序
现在,我们已经完成了程序的编写。让我们来编译并运行它吧!在终端中输入以下命令:
gcc -o listdir listdir.c
./listdir <directory name>
在这里,<directory name>
应替换为您想要列出的目录的路径。例如,如果您想列出当前目录下的所有文件和子目录,可以输入:
./listdir .
程序将会输出目录树中的所有文件和子目录:
./Makefile
./listdir
./listdir.c
./README.md
./src
./src/listdir.c
./src/main.c
总结
本篇文章介绍了如何使用系统调用函数opendir()
、readdir()
和closedir()
来编写一个可以列出目录中所有文件和子目录的C程序。该程序还使用了递归函数来遍历所有子目录。