最近在看Linux下文件操做相關章節,遇到了這麼幾個結構體,被搞的暈乎乎的,今日有空,仔細研究了一下,受益不淺。node
首先說說DIR這一結構體,如下爲DIR結構體的定義:編程
struct __dirstream 函數
{ ui
void *__fd; this
char *__data; spa
int __entry_data; 指針
char *__ptr; orm
int __entry_ptr; 索引
size_t __allocation; ci
size_t __size;
__libc_lock_define (, __lock)
};
typedef struct __dirstream DIR;
DIR結構體相似於FILE,是一個內部結構,如下幾個函數用這個內部結構保存當前正在被讀取的目錄的有關信息(摘自《UNIX環境高級編程(第二版)》)。函數 DIR *opendir(const char *pathname),即打開文件目錄,返回的就是指向DIR結構體的指針,而該指針由如下幾個函數使用:
struct dirent *readdir(DIR *dp);
void rewinddir(DIR *dp);
int closedir(DIR *dp);
long telldir(DIR *dp);
void seekdir(DIR *dp,long loc);
關於DIR結構,咱們知道這麼多就能夠了,不必去再去研究他的結構成員。
接着是dirent結構體,首先咱們要弄清楚目錄文件(directory file)的概念:這種文件包含了其餘文件的名字以及指向與這些文件有關的信息的指針(摘自《UNIX環境高級編程(第二版)》)。從定義可以看出,dirent不單單指向目錄,還指向目錄中的具體文件,readdir函數一樣也讀取目錄下的文件,這就是證據。如下爲dirent結構體的定義:
struct dirent
{
long d_ino; /* inode number 索引節點號 */
off_t d_off; /* offset to this dirent 在目錄文件中的偏移 */
unsigned short d_reclen; /* length of this d_name 文件名長 */
unsigned char d_type; /* the type of d_name 文件類型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最長255字符 */
}
從上述定義也可以看出來,dirent結構體存儲的關於文件的信息不多,因此dirent一樣也是起着一個索引的做用,若是想得到相似ls -l那種效果的文件信息,必需要靠stat函數了。
經過readdir函數讀取到的文件名存儲在結構體dirent的d_name成員中,而函數
int stat(const char *file_name, struct stat *buf);
的做用就是獲取文件名爲d_name的文件的詳細信息,存儲在stat結構體中。如下爲stat結構體的定義:
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; //該文件所佔的磁盤塊
};
這個記錄的信息就很詳細了吧,呵呵。
最後,總結一下,想要獲取某目錄下(好比a目下)b文件的詳細信息,咱們應該怎樣作?
首先,咱們使用opendir函數打開目錄a,返回指向目錄a的DIR結構體c。
接着,咱們調用readdir( c)函數讀取目錄a下全部文件(包括目錄),返回指向目錄a下全部文件的dirent結構體d。
而後,咱們遍歷d,調用stat(d->name,stat *e)來獲取每一個文件的詳細信息,存儲在stat結構體e中。
整體就是這樣一種逐步細化的過程,在這一過程當中,三種結構體扮演着不一樣的角色。