天天看點

C++擷取檔案夾下所有檔案名

查找檔案需要一個結構體和幾個函數。結構體為struct _finddata_t,函數為_findfirst、findnext和_findclose。

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位為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是一個常量宏,它在頭檔案中被定義,表示的是檔案名的最大長度。

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

下面一一介紹。

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

傳回值:如果查找成功的話,将傳回一個long型的唯一的查找用的句柄(就是一個唯一編号)。這個句柄将在_findnext函數中被使用。若失敗,則傳回-1。

參數:

filespec:标明檔案的字元串,可支援通配符。比如:.c,則表示目前檔案夾下的所有字尾為C的檔案。比如:D:\test\,則表示D盤的test檔案夾内的所有檔案。

fileinfo:這裡就是用來存放檔案資訊的結構體的指針。這個結構體必須在調用此函數前聲明,不過不用初始化,隻要配置設定了記憶體空間就可以。函數成功後,函數會把找到的檔案的資訊放入這個結構體中。

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

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

參數:

handle:即由_findfirst函數傳回回來的句柄。

fileinfo:檔案資訊結構體的指針。找到檔案後,函數将該檔案資訊放入此結構體中。

int _findclose( long handle );

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

參數:

handle:_findfirst函數傳回回來的句柄。

/*
@author:CodingMengmeng
@theme:擷取指定檔案夾下的所有檔案名
@time:2017-1-13 11:46:22
@blog:
*/
#include <io.h>
#include <iostream>
#include <vector>
using namespace std;

void getFiles(string path, vector<string>& files)
{
    //檔案句柄
    intptr_t 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函數結束查找
        _findclose(hFile);
    }
}


int main(){
    char * filePath = "sam";//自己設定目錄
    vector<string> files;

    擷取該路徑下的所有檔案
    getFiles(filePath, files);

    char str[30];
    int size = files.size();
    for (int i = 0; i < size; i++)
    {
        cout << files[i].c_str() << endl;
    }
}