首先說說DIR這一結(jié)構(gòu)體,以下為DIR結(jié)構(gòu)體的定義:
DIR結(jié)構(gòu)體類似于FILE,是一個內(nèi)部結(jié)構(gòu),以下幾個函數(shù)用這個內(nèi)部結(jié)構(gòu)保存當(dāng)前正在被讀取的目錄的有關(guān)信息(摘自《UNIX環(huán)境高級編程(第二版)》)。函數(shù) DIR *opendir(const char *pathname),即打開文件目錄,返回的就是指向DIR結(jié)構(gòu)體的指針,而該指針由以下幾個函數(shù)使用:
關(guān)于DIR結(jié)構(gòu),我們知道這么多就可以了,沒必要去再去研究他的結(jié)構(gòu)成員。
接著是dirent結(jié)構(gòu)體,首先我們要弄清楚目錄文件(directory file)的概念:這種文件包含了其他文件的名字以及指向與這些文件有關(guān)的信息的指針(摘自《UNIX環(huán)境高級編程(第二版)》)。從定義能夠看出,dirent不僅僅指向目錄,還指向目錄中的具體文件,readdir函數(shù)同樣也讀取目錄下的文件,這就是證據(jù)。以下為dirent結(jié)構(gòu)體的定義:
從上述定義也能夠看出來,dirent結(jié)構(gòu)體存儲的關(guān)于文件的信息很少,所以dirent同樣也是起著一個索引的作用,如果想獲得類似ls -l那種效果的文件信息,必須要靠stat函數(shù)了。
通過readdir函數(shù)讀取到的文件名存儲在結(jié)構(gòu)體dirent的d_name成員中,而函數(shù)
int stat(const char *file_name, struct stat *buf);
的作用就是獲取文件名為d_name的文件的詳細(xì)信息,存儲在stat結(jié)構(gòu)體中。以下為stat結(jié)構(gòu)體的定義:
最后,總結(jié)一下,想要獲取某目錄下(比如a目下)b文件的詳細(xì)信息,我們應(yīng)該怎樣做?
首先,我們使用opendir函數(shù)打開目錄a,返回指向目錄a的DIR結(jié)構(gòu)體c。
接著,我們調(diào)用readdir( c)函數(shù)讀取目錄a下所有文件(包括目錄),返回指向目錄a下所有文件的dirent結(jié)構(gòu)體d。
然后,我們遍歷d,調(diào)用stat(d->name,stat *e)來獲取每個文件的詳細(xì)信息,存儲在stat結(jié)構(gòu)體e中。