日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

UNIX 文件系統(tǒng)基本操作( 二 )


例如,許多 Unix 包含一個 d_type 成員和一些附加常量,這樣一來,您無需額外的 stat() 調(diào)用就可以檢查目錄條目的類型 。除了減少另外的系統(tǒng)調(diào)用之外,這種不可移植的擴(kuò)展還減少了從文件系統(tǒng)獲取更多元數(shù)據(jù)的開銷非常高的訪問操作 。眾所周知,在大多數(shù) UNIX 上,stat() 函數(shù)的執(zhí)行速度非常慢 。
獲取文件信息
除了獲取目錄中條目的名稱之外,您可能還需要一些附加信息,以確定下一步要進(jìn)行的操作 。至少,僅根據(jù)目錄條目的名稱,您無法辨別文件條目 。
stat() 函數(shù)會將特定文件的相關(guān)信息填入 struct stat 結(jié)構(gòu)中,如果您獲得的是文件描述符而不是文件名,那么作為替代,您可以使用 fstat() 函數(shù) 。如果您想能夠檢測出符號鏈接,那么可以對文件名使用 lstat() 。
與 readdir() 返回的 struct dirent 不同,struct stat 具有相當(dāng)多的標(biāo)準(zhǔn)的、必需的成員:
【UNIX 文件系統(tǒng)基本操作】st_mode——文件權(quán)限(用戶、其他用戶、組)和標(biāo)志
st_ino——文件序列號
st_dev——文件設(shè)備號
st_nlink——文件連接計數(shù)
st_uid——所有者用戶 ID
st_gid——所有者組 ID
st_size——以字節(jié)表示的文件大?。ㄡ槍ζ胀ㄎ募?br /> st_atime——最后的訪問時間
st_mtime——最后的修改時間
st_ctime——文件的創(chuàng)建時間
對 st_mode 成員使用 S_*() 宏,這樣就可以找出您所處理的目錄條目的類型:
S_ISBLK(mode)——是否為塊特殊文件?(通常是某種基于塊的設(shè)備)
S_ISCHR(mode)——是否為字符特殊文件?(通常是某種基于字符的設(shè)備)
S_ISDIR(mode)——是否為目錄?
S_ISFIFO(mode)——是否為管道或 FIFO 特殊文件?
S_ISLNK(mode)——是否為符號鏈接?
S_ISREG(mode)——是否為普通文件?
眾所周知,在大多數(shù)文件系統(tǒng)上,stat() 函數(shù)的執(zhí)行速度非常慢,所以如果您打算在將來再次使用該信息,可能需要對其進(jìn)行緩存 。
關(guān)于符號鏈接的說明
通常,您并不關(guān)心符號鏈接 。如果對符號鏈接調(diào)用 stat(),那么您將獲取該鏈接所指向的文件的相關(guān)信息 。這和用戶的體驗是一致的,因為控制與該文件交互的是目標(biāo)文件的權(quán)限,而不是符號鏈接本身 。
有些應(yīng)用程序,如 ls 和備份程序,需要能夠顯示鏈接文件本身的相關(guān)信息,例如它所指向的文件 。當(dāng)您使用 lstat() 來代替 stat() 時,以及當(dāng)您出于特定的目的而需要獲取符號鏈接本身的相關(guān)信息,而不是直接與其鏈接的文件打交道時,情況也是這樣的 。
將其組合在一起
既然已經(jīng)學(xué)習(xí)了如何使用 readdir() 和 stat() 來查找目錄中的條目,那么讓我們來看看演示這些函數(shù)的一些實(shí)際代碼 。
這里所介紹的代碼將瀏覽命令行中指定的一個或多個目錄,并顯示在該目錄中找到的每個條目的相關(guān)信息 。當(dāng)它找到另一個目錄時,它會對該目錄進(jìn)行同樣的處理 。對于符號鏈接,將顯示其目標(biāo)文件,并且還將顯示普通文件的大小 。將忽略特殊文件 。
如清單 2 所示,這個簡單的演示應(yīng)用程序中包含了各種 Header 文件 。程序的開始塊中包含了大多數(shù)程序中使用的標(biāo)準(zhǔn)部分,并且后面的四項是在該程序中使用 readdir() 和 stat() 所必需的 。
清單 2. Header 和常量
#include
#include
#include
#include
#include
#include
#include
#include
#include
process_Directory() 函數(shù)(開始于清單 3,結(jié)束于清單 6)讀取了指定的目錄,并顯示了每個條目的相關(guān)信息 。opendir() 返回的 DIR 指針與 fopen() 返回的 FILE 指針類似,它是一個用于跟蹤目錄流的操作系統(tǒng)特定的對象,您應(yīng)該忽略其具體內(nèi)容 。

推薦閱讀