1. 程式人生 > >使用C語言檢視一個資料夾中所有檔案及目錄

使用C語言檢視一個資料夾中所有檔案及目錄

1.前言

1.1宣告

文章中的文字可能存在語法錯語以及標點錯誤,請諒解;

如果在文章中發現程式碼錯誤或其它問題請告知,感謝!

2.實現方法

為了使用C語言實現檢視一個資料夾中的檔案數量功能,可以使用dirent庫,該庫檔案包含的許多UNIX系統服務的函式原型,例如opendir函式、readdir函式,可以實現檢視目錄中檔案數量等功能。

2.1dirent中常用資料型別以及函式功能簡介

下面對dirent中常用的資料型別以及函式進行簡單的解釋:

常用結構體:
DIR結構體:

struct __dirstream   
{   
    void *__fd;    
    char
*__data; int __entry_data; char *__ptr; int __entry_ptr; size_t __allocation; size_t __size; __libc_lock_define (, __lock) }; typedef struct __dirstream DIR;

DIR結構體類似與FILE,可以使用該結構體儲存正在被讀取目錄的有關資訊,例如開啟目錄函式DIR* opendir(const char* FilePath),該函式返回值為指向DIR結構的指標(控制代碼),通過該指標所指向的DIR型別的結構體,可以得到該目錄相關資訊。

dirent的結構體:

 struct dirent
 {    
      long d_ino;       /* inode number 索引節點號 在<sys/types.h>檔案該型別的描述*/
      off_t d_off;      /* offset to this dirent 在目錄檔案中的偏移 */
      unsigned short d_reclen;   /* length of this d_name 檔名長 */
      unsigned char d_type;      /* the type of d_name 檔案型別 */
      char
d_name [NAME_MAX+1]; /* file name (null-terminated) 檔名,最長256字元 */ }

一般該結構體配合readdir函式使用,也就是通過readdir函式獲取到的檔案屬性儲存到該結構體中。
需要注意的是,對於dirent的結構體,我們經常能用到該結構體中d_ name 變數, 另外 ,short d_reclen是指這個檔案的檔名長度,而不是檔案大小。當然,如果要獲得該檔案大小,可以使用sizeof ( d _name)實現。
(當然,如果我們想要得到該檔案的更多資訊,可以使用stat函式實現,具體用法可以參見下面的部落格:
https://blog.csdn.net/farmwang/article/details/77996187

通過上述介紹,可以簡單概括dirent結構體和DIR結構體的區別:dirent結構體儲存的是檔案屬性,DIR結構體儲存的目錄屬性。

常用庫函式:
DIR* opendir(const char);
通過開啟一個目錄路徑(const char)返回一個DIR型別的指標,後續對該目錄的讀取和搜尋操作都使用該指標。

dirent* readdir(DIR*);
返回DIR中的目錄或者檔案實體指標,型別為dirent,需要注意的是,當該函式再一次被呼叫的時候,該dirent指標指向下一個目錄或者檔案實體。當函式返回NULL時,表明指標已經指向目錄的結尾。

void seekdir (DIR * dir, long int offset);
用來設定目錄操作流的讀取位置,呼叫seekdir函式的時候便從該位置進行讀取。引數offset表示相對於檔案目錄開頭的偏移量。

int telldir(DIR *dir) ;
返回當前目錄流中指標位置。改位置是相對於檔案開頭偏移量的下一個實體讀取位置的返回值。

2.2函式實現

2.2.1實現邏輯

實現方法一般為:
1.開啟目錄(opendir());
2.讀取檔案(readdir());
3.關閉目錄( closedir)。

2.2.2函式例子

    #include <stdio.h> 
    #include "dirent.h"  

    #define  FilePath "/opt/test"

    int main()  
    {     
    int filesize = 0;  
        DIR *dir = NULL;  
        struct dirent *entry;  

        if((dir = opendir(FilePath))==NULL)  
        {  
            printf("opendir failed!");  
            return -1;  
        }
    else  
        {  
             while(entry=readdir(dir))  
            {  
                printf("filename%d = %s",i,entry->d_name);  //輸出檔案或者目錄的名稱
                printf("filetype = %d\n",entry->d_type);  //輸出檔案型別   
            }  

             closedir(dir);    
     }  
     return 0;    
    }  

執行結果如下:
這裡寫圖片描述

這裡寫圖片描述