1. 程式人生 > >C++ 讀取資料夾下的所有檔名

C++ 讀取資料夾下的所有檔名

那麼到底如何查詢檔案呢?我們需要一個結構體和幾個大家可能不太熟悉的函式。這些函式和結構體在<io.h>的標頭檔案中,結構體為struct _finddata_t ,函式為_findfirst、_findnext和_fineclose。具體如何使用,我會慢慢講來~
        首先講這個結構體吧~ struct _finddata_t ,這個結構體是用來儲存檔案各種資訊的。說實話,這個結構體的具體定義程式碼,我沒有找到,不過還好,文件裡面在_find裡有比較詳細的成員變數介紹。我基本上就把文件翻譯過來講吧:


        unsigned atrrib:檔案屬性的儲存位置。它儲存一個unsigned單元,用於表示檔案的屬性。檔案屬性是用位表示的,主要有以下一些:_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、_A_SUBDIR(資料夾)、_A_SYSTEM(系統)。這些都是在<io.h>中定義的巨集,可以直接使用,而本身的意義其實是一個無符號整型(只不過這個整型應該是2的幾次冪,從而保證只有一位為1,而其他位為0)。既然是位表示,那麼當一個檔案有多個屬性時,它往往是通過位或的方式,來得到幾個屬性的綜合。例如只讀+隱藏+系統屬性,應該為:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。


        time_t time_create:這裡的time_t是一個變數型別(長整型?相當於long int?),用來儲存時間的,我們暫時不用理它,只要知道,這個time_create變數是用來儲存檔案建立時間的就可以了。


        time_t time_access:檔案最後一次被訪問的時間。


        time_t time_write:檔案最後一次被修改的時間。


        _fsize_t size:檔案的大小。這裡的_fsize_t應該可以相當於unsigned整型,表示檔案的位元組數。


        char name[_MAX_FNAME]:檔案的檔名。這裡的_MAX_FNAME是一個常量巨集,它在<stdlib.h>標頭檔案中被定義,表示的是檔名的最大長度。


        以此,我們可以推測出,struct _finddata_t ,大概的定義如下:


        struct   _finddata_t
        {
             unsigned attrib;
             time_t time_create;
             time_t time_access;
             time_t time_write;
             _fsize_t size;
             char name[_MAX_FNAME];
        };


        前面也說了,這個結構體是用來儲存檔案資訊的,那麼如何把一個硬碟檔案的檔案資訊“存到”這個結構體所表示的記憶體空間裡去呢?這就要靠_findfirst、_findnext和_fineclose三個函式的搭配使用了。


        首先還是對這三個函式一一介紹一番吧……


        long _findfirst( char *filespec, struct _finddata_t *fileinfo );


        返回值:如果查詢成功的話,將返回一個long型的唯一的查詢用的控制代碼(就是一個唯一編號)。這個控制代碼將在_findnext函式中被使用。若失敗,則返回-1。


        引數:


        filespec:標明檔案的字串,可支援萬用字元。比如:*.c,則表示當前資料夾下的所有後綴為C的檔案。


        fileinfo :這裡就是用來存放檔案資訊的結構體的指標。這個結構體必須在呼叫此函式前宣告,不過不用初始化,只要分配了記憶體空間就可以了。函式成功後,函式會把找到的檔案的資訊放入這個結構體中。


        int _findnext( long handle, struct _finddata_t *fileinfo );


        返回值:若成功返回0,否則返回-1。


        引數:


        handle:即由_findfirst函式返回回來的控制代碼。


        fileinfo:檔案資訊結構體的指標。找到檔案後,函式將該檔案資訊放入此結構體中。


       int _findclose( long handle );


        返回值:成功返回0,失敗返回-1。


        引數:


        handle :_findfirst函式返回回來的控制代碼。