Linux的目录操作一般流程为:打开目录-读取目录(中的文件)-关闭目录。相应的函数为opendir-readdir-closedir,其原型都在/usr/include/dirent.h中定义。
原型:
#include <dirent.h>
DIR *opendir(const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);
DIR是directory stream,opendir函数返回dir流类型并供读取函数readdir调用;
readdir返回dirent结构体:
struct dirent
{
#ifndef __USE_FILE_OFFSET64
__ino_t d_ino;
__off_t d_off;
#else
__ino64_t d_ino;
__off64_t d_off;
#endif
unsigned short int d_reclen;
unsigned char d_type;
char d_name[256]; /* We must not include limits.h! */
};
d_reclen表示记录长度,d_type表示文件类型(具体见后面),d_name表示文件名;
closedir返回0表示关闭成功,-1表示失败。
dirent结构体中的d_tpye的值可以为以下枚举成员:
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
};
示例:
#include<dirent.h>
string testPath;
DIR* pDir = NULL;
struct dirent* ent = NULL;
pDir = opendir(testPath.c_str());
if (NULL == pDir){
return false;
}
while (NULL != (ent=readdir(pDir)))
{
if(ent->d_type == 8) //普通文件
{
…
}
}
…
closedir(pDir);
pDir = NULL;