前幾天需要實現對整個目錄樹的遍歷,查閱了相關的一些資料。開始找到的原始的方法是使用readdir()與lstat()函式實現遞迴遍歷,後來發現linux對於目錄遍歷這種最常用的操作已經提供了很完善的介面:ftw()與nftw()。下面就這兩種方法具體說明一下。
1、手動實現遞迴
1.1 stat()函式族
stat函式族包括:stat,fstat以及lstat函式,都是向使用者返回檔案的屬性資訊(元資料)。
三個函式的返回:若成功為0,出錯為-1。對乙個pathname,stat函式返回乙個與此命名檔案有關的資訊結構,fstat函式獲得已在描述符filedes上開啟的檔案的有關資訊。 lstat函式類似於stat,但是當命名的檔案是乙個符號連線時,lstat返回該符號連線的有關資訊,而不是由該符號連線引用的檔案的資訊。
第二個引數是個指標,它指向乙個我們應提供的結構。這些函式填寫由buf指向的結構。該結構的實際定義可能所實施而有所不同,但其基本形式是:
struct stat;
下面是乙個簡單的測試
這裡補充說明一下linux中檔案的基本型別。
1.普通檔案(regular file)。這是最常見的檔案型別,這種檔案包含了某種形式的資料。至於這種資料是文字還是二進位制資料對於系統核而言並無區別。對普通檔案內容的解釋由處理該檔案的應用程式進行。
2.目錄檔案(directory file)。這種檔案包含了其它檔案的名字以及指向與這些檔案有關資訊的指標。對乙個目錄檔案具有讀許可數的任一程序都可以讀該目錄的內容,但只有系統核可以寫目錄檔案。
3.字元特殊檔案(charocter special file)。這種檔案用於系統中的某些型別的裝置。
4.塊特殊檔案(block special file)。這種檔案典型地用於磁碟裝置。系統中的所有裝置或者是字元特殊檔案,或者是塊特殊檔案。
5.fifo。這種檔案用於程序間的通訊,有時也將其稱為命名管道。
6.套介面(socket)。這種檔案用於程序間的網路通訊。套介面也可用於在一台宿主機上的程序之間的非網路通訊。
7.符號連線(symboliclink)。這種檔案指向另乙個檔案。
對於檔案型別,可以利用定義的巨集比如s_isdir()等測試st_mode,判斷檔案型別。巨集有s_isreg、s_isdir、s_ischr、s_isblk、s_isfifo、s_islnk、s_issock。
1.2 遍歷目錄例子
引用別人的乙個例子,現在把許多檔案處理函式集中在一起使用,程式遍歷指定目錄的檔案,同時也要進到下級子目錄中進行遍歷,這一點是將子目錄遞迴傳遞到opendir中去,需要指出的是,這就決定了如果子目錄巢狀過深,程式將失敗返回,因為允許開啟的子目錄流數量是有上限的。
which prints out the current directory.
it will recurse for subdirectories, using the depth parameter is used for indentation. */
#include #include #include #include #include void printdir(char *dir, int depth)
chdir(dir);
while((entry = readdir(dp)) != null)
else printf("%*s%s/n",depth,"",entry->d_name);
}chdir("..");
closedir(dp);
}/**//* now we move onto the main function. */
int main(int argc, char* argv)
遍歷目錄樹
cpath os.getcwd 如果目錄名字為中文 需要轉碼處理 upath unicode cpath,utf 8 for filename in os.listdir upath print filenameimport os for foldername,subfolders,filename...
linux下遍歷目錄和檔案
目錄操作相關函式 1 opendir 開啟目錄 dir opendir const char name 引數 要開啟的目錄名 返回值 指向目錄的指標 這裡的dir型別可以int dirfd dir dirp 函式轉變為描述符 fd 2 讀目錄 readdir struct dirent readdi...
Linux下目錄遍歷 結構體dirent
在linux下遍歷某一目錄下內容linux下歷遍目錄的方法一般是這樣的 開啟目錄 讀取 關閉目錄 相關函式是opendir readdir closedir,其原型如下 include dir opendir const char dirname struct dirent readdir dir ...