使用opendir、readdir、closedir分别打开目录、读取目录和关闭目录
//需要的头文件
#include <dirent.h>
#include <sys/types.h>
//打开指定目录opendir得到目录句柄
DIR *dir = opendir(filepath);
//struct dirent结构体变量,用来存储子目录项
struct dirent *entry;
//然后通过while循环不断readdir,获取目录中的内容
while ((entry = readdir(dir)) != 0) {
//获取该结构体变量的成员函数d_name就得到了待扫描的文件,然后在使用sprintf函数加入文件绝对路径
printf("%s\n",entry->d_name);
char* newpath;
sprintf(newpath, "%s%s", filepath, entry->d_name);
printf("%s\n",newpath);
}
//最后关闭目录句柄closedir
closedir(dir);
扩展:
1. dirent结构体的内容如下
Struct dirent
{
ino_t d_ino; //索引节点号
ff_t d_off; //在文件目录中的偏移
unsigned short int d_reclem; //d_name的长度,不包含NULL字符
unsigned char d_type; //d_name所指的文件类型
char d_name[256]; //文件名
};
其中d_type中各个数字表示的文件类型如下,获取到结构体变量后,可使用d_type值判断文件类型。
enum
{
DT_UNKNOWN = 0, //未知类型
# define DT_UNKNOWN DT_UNKNOWN
DT_FIFO = 1, //管道
# define DT_FIFO DT_FIFO
DT_CHR = 2, //字符设备
# define DT_CHR DT_CHR
DT_DIR = 4, //目录
# define DT_DIR DT_DIR
DT_BLK = 6, //块设备
# define DT_BLK DT_BLK
DT_REG = 8, //常规文件
# define DT_REG DT_REG
DT_LNK = 10, //符号链接
# define DT_LNK DT_LNK
DT_SOCK = 12, //套接字
# define DT_SOCK DT_SOCK
DT_WHT = 14 //链接
# define DT_WHT DT_WHT
};
2. readdir函数获取的是目录下所有文件,包含:.(点,指向当前目录)和 ..(点点,指向父目录)。创建新目录时会自动创建这两个文件名。
但以 .(点)开头命名的文件会隐藏,所以 ls 命令的结果中没有这两个文件名。
使用 ls -a 命令显示当前目录下的所有文件及文件夹包括隐藏的.和..等
ls -l //显示不隐藏的文件与文件夹的详细信息
ls -al //显示当前目录下的所有文件及文件夹包括隐藏的.和..等的详细信息
若忽略readdir结果中的 . 和 .. 文件名,可使用如下方法
if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, ".."))
continue;