目录IO
目录 IO 用于操作 Linux 目录(文件夹),读取目录下的文件列表、创建目录。 头文件
#include <dirent.h> // opendir readdir closedir
#include <sys/stat.h> // mkdir
一、核心概念
DIR *:目录流指针,类似文件 IO 的文件描述符、标准 IO 的FILE*。struct dirent结构体:保存读取到的目录项信息(文件名、inode 号、文件类型等)。
struct dirent 结构体
struct dirent { ino_t d_ino; /* inode编号 */ off_t d_off; unsigned short d_reclen; unsigned char d_type; /* 文件类型 */ char d_name[256]; /* 文件/目录名字,字符串 */ };
重点成员:
d_ino:inode 节点号d_name[256]:目录下的文件名,最重要成员d_type:文件类型
二、目录操作函数
1. opendir () 打开目录
DIR *opendir(const char *name);
功能:打开一个目录,获得目录流指针
参数:
name目录路径字符串返回值: ✅成功:
DIR*目录流指针 ❌失败:NULL
2. readdir () 读取目录项
struct dirent *readdir(DIR *dirp);
功能:读取目录流中的一条目录项(一个文件 / 子文件夹信息),调用一次读一条,内部自动后移。
参数:
dirpopendir 返回的目录流指针返回值: ✅成功:返回
struct dirent *结构体指针,拿到当前文件信息 ❌读到目录末尾 / 出错:返回NULL
注意:会读到
.(当前目录)、..(上一级目录),业务代码一般要过滤掉。
3. closedir () 关闭目录
int closedir(DIR *dirp);
功能:关闭已经打开的目录流,释放资源
参数:目录流指针
返回:成功返回
0;失败返回‑1
4. mkdir () 创建目录
int mkdir(const char *pathname, mode_t mode);
功能:创建一个文件夹(目录文件)
参数
实际权限 =
mode & ~umaskpathname:要创建的目录名路径mode:目录权限(八进制,如0775,目录必须有执行权限才能进入访问)
返回:成功
0;失败‑1
三、完整示例代码:遍历目录,打印目录内所有文件名
#include <stdio.h>
#include <dirent.h>
int main(void)
{
//打开目录 DIR *pdir = opendir("/dev");
if (NULL == pdir)
{
perror("opendir");
return -1;
}
struct dirent *pinfo;
while( (pinfo = readdir(pdir)) != NULL )
{
//过滤 . 和 .. if(pinfo->d_name[0] == '.') continue;
printf("文件名:%s inode号:%ld\n", pinfo->d_name, pinfo->d_ino);
}
closedir(pdir);
return 0;
}
四、配套 shell 命令对照
C 函数 | shell 命令 | 作用 |
mkdir() |
| 创建文件夹 |
opendir/readdir |
| 读取列出目录内容 |
五、易错点总结
readdir读到.和..,业务程序一般要过滤,否则会打印这两个虚拟目录。目录权限必须带执行位,例如
0775;如果权限设置为0664,无法进入访问目录。opendir 打开后,必须调用
closedir关闭,避免资源泄露。readdir 返回的结构体是库内部静态空间,不要自己 free。