在 Linux 系统中,opendir() 函数用于打开一个目录流,以便后续使用其他相关函数(如 readdir() 和 closedir())来读取目录的内容。以下是如何使用 opendir() 函数读取目录内容的步骤和示例代码:
包含必要的头文件:
dirent.h:提供目录操作相关的函数和结构体。stdio.h 和 stdlib.h:用于标准输入输出和内存管理。使用 opendir() 打开目录:
DIR 结构的指针;否则返回 NULL。使用 readdir() 读取目录项:
readdir() 来逐个获取目录中的条目。struct dirent 结构体,包含文件名等信息。检查读取是否结束:
readdir() 在到达目录末尾时返回 NULL。关闭目录流:
closedir() 函数关闭已打开的目录流。#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
int main() {
DIR *dir;
struct dirent *entry;
// 打开当前目录
dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return EXIT_FAILURE;
}
printf("当前目录下的文件和文件夹:\n");
// 读取目录中的每个条目
while ((entry = readdir(dir)) != NULL) {
// 跳过当前目录和上级目录的特殊条目
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
// 关闭目录流
closedir(dir);
return EXIT_SUCCESS;
}
打开目录:
dir = opendir(".");
这里 "." 表示当前目录。你也可以替换为其他目录路径,例如 "/home/user/Documents"。
错误处理:
if (dir == NULL) {
perror("opendir");
return EXIT_FAILURE;
}
如果 opendir() 失败,perror 会打印出相应的错误信息。
读取目录项:
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
printf("%s\n", entry->d_name);
}
使用 readdir() 循环读取每个目录项,并通过 strcmp 跳过 "." 和 ".." 这两个特殊条目。
关闭目录流:
closedir(dir);
确保在操作完成后关闭目录流,释放资源。
获取更多信息:
struct dirent 结构体中还包含其他信息,如文件类型、inode 号等。你可以根据需要进一步处理这些信息。
过滤特定类型的文件:
可以在循环中添加条件判断,筛选出特定扩展名或类型的文件。例如,只列出 .txt 文件:
if (strstr(entry->d_name, ".txt") != NULL) {
printf("%s\n", entry->d_name);
}
递归遍历子目录:
若要递归地读取子目录的内容,可以在遇到子目录时调用 opendir() 并重复上述过程。
通过以上步骤和示例代码,你可以使用 opendir() 函数在 Linux 系统中读取目录内容,并根据需求进行相应的处理。