1. 程式人生 > >c++讀取資料夾中檔案

c++讀取資料夾中檔案

直接上程式碼:

void getFiles(string path, vector<string>& pic_files)
{
    //檔案控制代碼  
    intptr_t hFile;
    //檔案資訊  
    struct _finddata_t fileinfo;
    string p;
    if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
    {
	do
	{
            //如果不是,加入列表  
	    if ((fileinfo.attrib &  _A_SUBDIR))
	    {    
                //int strcmp(const char* s1,const char* s2)
                //當s1<s2時,返回為負數;
                //當s1==s2時,返回值= 0;
                //當s1>s2時,返回正數。
		if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
		    //如果是目錄,迭代 
		    getFiles(p.assign(path).append("\\").append(fileinfo.name), pic_files);
	    }
	    else
		{
		//加入列表 
		pic_files.push_back(p.assign(path).append("\\").append(fileinfo.name));
		}
	} while (_findnext(hFile, &fileinfo) == 0);
	_findclose(hFile);
    }
}

其中主要用到了 _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 atrrib表示了檔案屬性的儲存位置。它儲存一個unsigned單元,用於表示檔案的屬性。檔案屬性是用位表示的,主要有以下一些:_A_ARCH(存檔)、_A_HIDDEN(隱藏)、_A_NORMAL(正常)、_A_RDONLY(只讀)、_A_SUBDIR(資料夾)、_A_SYSTEM(系統)。

程式碼中的_findfirst、_findnext和_fineclose介紹:

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

返回值:如果查詢成功的話,將返回一個long型的唯一的查詢用的控制代碼。這個控制代碼將在_findnext函式中被使用。

若失敗,則返回-1。

在vs2015,release x64中,如果使用long會報錯,(ntdll.dll)處(位於 xxxxxxx.exe 中)引發的異常將其修改為:

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

filespec:標明檔案的字串,可支援萬用字元。比如:*.c,則表示當前資料夾下的所有後綴為C的檔案。
fileinfo :這裡就是用來存放檔案資訊的結構體的指標。這個結構體必須在呼叫此函式前宣告,不過不用初始化,只要分配了記憶體空間就可以了。函式成功後,函式會把找到的檔案的資訊放入這個結構體中。

int _findnext( long handle, struct _finddata_t *fileinfo );
handle :_findfirst函式返回回來的控制代碼。
fileinfo:檔案資訊結構體的指標。找到檔案後,函式將該檔案資訊放入此結構體中。

int _findclose( long handle );
返回值:成功返回0,失敗返回-1。
handle :_findfirst函式返回回來的控制代碼。