1. Linux目录操作基础:从文件系统到目录流
在Linux系统编程中,目录操作是最基础也是最重要的功能之一。与Windows系统不同,Linux将目录视为一种特殊类型的文件,这种设计理念贯穿了整个Unix-like系统的架构。理解目录操作的核心在于把握三个关键概念:文件系统、目录项和目录流。
文件系统是操作系统用于明确存储设备(通常是磁盘)上的文件的方法和数据结构。在Linux中,一切皆文件,目录也不例外。每个目录实际上是一个包含目录项列表的特殊文件,这些目录项记录了该目录下所有文件和子目录的信息。
目录流(DIR)则是我们在程序中操作目录的抽象接口。当调用opendir()函数打开一个目录时,系统会创建一个目录流对象,这个对象维护着当前读取位置的状态信息。readdir()函数正是通过这个流对象,按顺序读取目录中的各个条目。
注意:目录流与文件描述符不同,它有自己的独立操作接口(opendir/readdir/closedir),不能混用文件操作函数(如read/write)。
2. readdir函数深度解析
2.1 函数原型与参数说明
readdir函数的原型非常简单:
c复制struct dirent *readdir(DIR *dirp);
唯一参数dirp是由opendir()返回的DIR指针,它代表一个已打开的目录流。这个指针内部维护着目录读取的状态信息,包括当前读取位置等。
在实际编程中,我们通常会这样使用:
c复制DIR *dir = opendir("/path/to/directory");
if (dir == NULL) {
perror("opendir failed");
return -1;
}
2.2 返回值与错误处理
readdir的返回值处理需要特别注意,因为它有两种情况会返回NULL:
- 正常到达目录末尾
- 读取过程中发生错误
正确的错误判断方式应该是:
c复制struct dirent *entry;
errno = 0; // 清空错误标志
while ((entry = readdir(dir)) != NULL) {
// 处理目录项
}
if (errno != 0) {
perror(
