1. 程式人生 > >C++ 獲得指定目錄下的所有檔名稱

C++ 獲得指定目錄下的所有檔名稱

最近工作用到,記錄一下。

參考出處:http://qiaoxinwang.blog.163.com/blog/static/86096452010612139172/

先上一下程式碼:

void getFiles( string path, vector<string>& files )  
{  
    //檔案控制代碼  
    long   hFile   =   0;  
    //檔案資訊  
    struct _finddata_t fileinfo;  
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {  
            //如果是目錄,迭代之  
            //如果不是,加入列表  
            if((fileinfo.attrib &  _A_SUBDIR))  
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );  
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }  
}  

程式碼出處

實現以上功能呢,利用了_finddata_t這個struct,_finddata_t包含在標頭檔案<io.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];
};

其中各成員變數的含義如下:【百度百科】 unsigned attrib: 檔案屬性儲存位置。它儲存一個unsigned單元,用於表示檔案的屬性。
檔案屬性是用位表示的,主要有以下一些: _A_ARCH(存檔) _A_HIDDEN(隱藏) _A_NORMAL(正常) _A_RDONLY(只讀) _A_SUBDIR(資料夾) _A_SYSTEM(系統) 這些都是在標頭檔案中定義的巨集,可以直接使用,而本身的意義其實是一個無符號整型(只不過這個整型應該是2的幾次冪,從而保證只有一位為1,而其他位為0)。既然是位表示,那麼當一個檔案有多個屬性時,它往往是通過位或的方式,來得到幾個屬性的綜合。例如只讀+隱藏+系統屬性,應該為:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。 time_t time_create: 這裡的time_t是一個變數型別,用來儲存時間的,我們暫時不用理它,只要知道,這個time_create變數是用來儲存檔案建立時間的就可以了。 time_t time_access:檔案最後一次被訪問的時間。 time_t time_write:檔案最後一次被修改的時間。 _fsize_t size:檔案的大小。這裡的_fsize_t應該可以相當於unsigned整型,表示檔案的位元組數。 char name[_MAX_FNAME]:檔案的檔名。這裡的_MAX_FNAME是一個常量巨集,它在標頭檔案中被定義,表示的是檔名的最大長度。 接下來就是將檔案資訊存到這個結構體中,利用<io.h>中的三個函式完成,分別是:_findfirst,_findnext,_findclose。
 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函式返回回來的控制代碼。

整個流程:查詢第一個檔案,成功後,繼續下一個。。。最後關閉。 上述程式中,用了遞迴,如果是子目錄,遞迴繼續獲取子目錄下的檔案資訊。