在 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 系统中读取目录内容,并根据需求进行相应的处理。