一、结构体DIR
struct __dirstream
{
void *__fd;
char *__data;
int __entry_data;
char *__ptr;
int __entry_ptr;
size_t __allocation;
size_t __size;
__libc_lock_define (, __lock)
};
/* This is the data type of directory stream objects.
The actual structure is opaque to users. */
//这是一个目录流对象的数据类型,实际上该结构体对用户是不可见的
typedef struct __dirstream DIR;
1、DIR结构体类似于FILE,是一个内部结构;
2、以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。
extern DIR *opendir (const char *__name);
extern int closedir (DIR *__dirp);
extern struct dirent *readdir (DIR *__dirp);
3、函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,如果参数为文件,则会返回NULL,打开失败;
二、结构体dirent
1、dirent结构体,首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。
2、从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,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];//文件名,最长255字符 /* We must not include limits.h! */
};
3、从上面的结构体可以看出,存储文件的信息非常少,如果想获取到更新的信息,必须要用到结构体stat;
4、通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中
5、函数int stat(const char *file_name, struct stat *buf);的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:
三、结构体stat
1、函数原型#include <sys/stat.h>,结构体定义如下
struct stat { mode_t st_mode; //文件访问权限 ino_t st_ino; //索引节点号 dev_t st_dev; //文件使用的设备号 dev_t st_rdev; //设备文件的设备号 nlink_t st_nlink; //文件的硬连接数 uid_t st_uid; //所有者用户识别号 gid_t st_gid; //组识别号 off_t st_size; //以字节为单位的文件容量 time_t st_atime; //最后一次访问该文件的时间 time_t st_mtime; //最后一次修改该文件的时间 time_t st_ctime; //最后一次改变该文件状态的时间 blksize_t st_blksize; //包含该文件的磁盘块的大小 blkcnt_t st_blocks; //该文件所占的磁盘块 };
2、提供文件名字,获取文件对应属性:int stat(const char *restrict pathname, struct stat *restrict buf);
3、通过文件描述符 获取文件对应的属性。
4、连接文件描述命,获取文件属性。int lstat(const char *restrict pathname, struct stat *restrict buf);
综上所述,以下给出一个例子:
#include <iostream>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
using namespace std;
int main(int argc, char *argv[])
{
cout << "Hello World!" << endl;
DIR *dirptr = NULL;
int i = 1;
struct dirent *entry;
if( (dirptr = opendir("/home/ww/Work/Gerrit/gerrit/YOcOTA/build.xml")) == NULL)
{
cout << "open dir failed!" << endl;
return 1;
}
else
{
while(entry = readdir(dirptr))
{
cout << "filename" << i << "=" << entry->d_name << endl;
struct stat *statss;
i++;
}
closedir(dirptr);
}
return 0;
}