linux下遍歷目錄樹方法總結(上)

前幾天需要實現對整個目錄樹的遍歷,查閱了相關的一些資料。開始找到的原始的方法是使用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{
        mode st_mode; /*文件類型和方式(許可數)*/
        ino st_ino;/* i-節點號(序列號)*/
        dev st_dev;/*設備號(文件系統)*/
        dev st_rdev;/*特殊文件的設備號*/
        nlink st_nlink;/*連接數*/
        uid st_uid;/*屬主的用戶ID*/
        gid st_gid;/*屬主的組ID*/
        off st_size;/*普通文件的字節長度*/
        time st_atime;/*最後存取時間*/
        time st_mtime;/*最後修改存取時間*/
        time st_ctime;/*最後文件狀態更改時間*/
        long st_blksize;/*最佳I/O塊長*/
        long st_blocks;/*分配的512字節塊塊數
        };

 

下面是一個簡單的測試

 

這裏補充說明一下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中去,需要指出的是,這就決定了如果子目錄嵌套過深,程序將失敗返回,因爲允許打開的子目錄流數量是有上限的。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章