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

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

本文示例源代碼或素材下載
引言
Unix?中任何事物都是文件 的觀點意味著,您將始終會與文件和目錄打交道,無論您開發(fā)的是何種類型的應用程序 。任何事物都存儲為文件,從數(shù)據到配置文件、甚至是設備,在對 UNIX 編程經過幾個小時的學習之后,stdio.h 系統(tǒng) Header 中的函數(shù)將能夠為您提供很好的幫助 。
一個時常困擾 UNIX 編程新手的問題是,如何瀏覽一個目錄,并對其中的文件、目錄和符號鏈接進行相應的處理 。如何能夠獲取它們的列表,以及如何能夠確定它們究竟是什么?
請繼續(xù)閱讀本文,以學習如何使用 dirent.h 函數(shù)系列 (opendir()/readdir()/closedir()) 來讀取目錄中的條目,以及使用 stat() 函數(shù)來確定這些條目所對應的內容 。
開始之前
本文中的示例代碼(請參見下載)使用 C/C開發(fā)工具 (CDT) 在 Eclipse 3.1 中編寫,readdir_demo 項目是一個托管的 Make 項目,該項目通過使用 CDT 程序生成規(guī)則構建 。您在這個項目中找不到 Makefile,但是它們非常簡單,如果需要在 Eclipse 之外編譯這些代碼,您可以很容易地生成相應的 Makefile 。
如果您還沒有嘗試使用 Eclipse,那么您真的應該試一試 。它是一個非常好的集成開發(fā)環(huán)境 (IDE),并且隨著發(fā)行版本的不斷更新,它變得更加完善 。它來自于生命力頑強的 EMacS 以及基于 Makefile 的開發(fā)工具 。請參閱本文結尾處的參考資料部分,其中提供了一些很好的 Eclipse 文章的鏈接 。
讀取目錄條目
對于一個給定路徑的目錄,應該如何讀取其中的條目呢?您無法像操作文件那樣打開目錄(使用 open() 或 fopen() 函數(shù)),并且即便可以這樣做,所得到的數(shù)據可能是您正在使用的文件系統(tǒng)的專用格式,而對于不十分熟悉的程序員來說,直接訪問這些數(shù)據將使情況變得更糟 。
dirent.h 函數(shù),opendir()、readdir() 和 closedir(),它們正是您所需要的 。這些函數(shù)的使用與用來對文件進行操作的 open/read/close 的習慣用法非常相似,但有一點除外:對于每個目錄條目,readdir() 函數(shù)一次返回一個指向特殊結構(struct dirent 類型)的指針 。通常,對目錄進行瀏覽類似于清單 1 中所示的偽代碼 。
清單 1. 讀取目錄中的內容
dir = opendir( "some/path/name" )
entry = readdir( dir )
while entry is not NULL:
do_something_with( entry )
entry = readdir( dir )
closedir( dir )
在出現(xiàn)問題時,opendir() 和 readdir() 函數(shù)都會返回 NULL,并且將設置全局變量 errno 的值,以指出所出現(xiàn)的錯誤 。如果 readdir() 返回 NULL,并且 errno 為 0(有時也稱為 EOK 或 ENOERROR),則表示沒有其他的目錄條目 。
有一點需要注意,每個目錄都包含“.(對該目錄的引用)和“..(對該目錄的父目錄的引用)條目 。根據您所進行的操作,可能需要忽略對這些條目的處理 。
請注意,readdir() 不是線程安全的,因為所返回的結構是存儲在函數(shù)庫中的一個靜態(tài)變量 。大多數(shù)現(xiàn)代的 Unix 系統(tǒng)都具有線程安全的 readdir_r(),如果您正在編寫線程代碼,可以使用這個函數(shù)作為替代 。
struct dirent 中包含了哪些內容呢?
POSIX 1003.1 標準僅僅為 struct dirent 定義了一個必需的條目,即 char 數(shù)組 d_name 。這是用標準的以 NULL 結尾的字符串表示的該條目的名稱 。這個結構中任何其他內容都是特定于您的 UNIX 系統(tǒng)的 。
的確如此,struct dirent 中其他所有內容 都是不可移植的 。嚴格滿足一致性的系統(tǒng)不應該在其中包含任何其他的內容 。如果您編寫了使用額外結構成員的代碼,那么您必須將其標記為不可移植的,并且包含一個完成相同任務的替換代碼路徑,如果您認為這樣做特別友好的話 。

推薦閱讀