1. 程式人生 > >C++讀取特定路徑下檔案目錄及檔名稱

C++讀取特定路徑下檔案目錄及檔名稱

1、讀取某給定路徑下所有資料夾與檔名稱,並帶完整路徑。程式碼如下:

void load_dir(string path, vector<string>& files) {
	   //檔案控制代碼
		   long hFile = 0;
	   //檔案資訊
		     struct _finddata_t fileinfo;  //很少用的檔案資訊讀取結構
	   string p;  //string類很有意思的一個賦值函式:assign(),有很多過載版本
  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) {
					                     files.push_back(p.assign(path).append("\\").append(fileinfo.name));
					                  load_dir(p.assign(path).append("\\").append(fileinfo.name), files);
					
				}
				
			}
			else {
				                files.push_back(p.assign(path).append("\\").append(fileinfo.name));
				
			}
			
		} while (_findnext(hFile, &fileinfo) == 0);  //尋找下一個,成功返回0,否則-1
			        _findclose(hFile);
			
	}
	
}

該函式有兩個引數,第一個為路徑字串(string型別,最好為絕對路徑);第二個引數為資料夾與檔名稱儲存變數(vector型別,引用傳遞)。在主函式中呼叫格式(並將結果儲存在檔案"AllFiles.txt"中,第一行為總數):

int main()
{
	string  filePath = "F:\\ORL";
	vector<string> files;
	string distAll = "CurrentDir.txt";
	load_dir(filePath, files);
	ofstream ofn(distAll);
    int size = files.size();
	ofn << size << endl;
	for (int i = 0; i < size; i++) {
		   ofn << files[i] << endl;
	}
	ofn.close();
}

2、只讀取某給定路徑下的當前資料夾名(以下類似,只給出函式,呼叫案例同上):

void getJustCurrentDir(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) 
								 {
					                     //files.push_back(fileinfo.name);
					                     files.push_back(p.assign(path).append("\\").append(fileinfo.name));
				                 }
			             }
		            } 
				 while (_findnext(hFile, &fileinfo) == 0);
			        _findclose(hFile);	
	     }
	
}

3、只讀取某給定路徑下的當前檔名:

void getJustCurrentFile(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)) {                 ;
           } else {
                files.push_back(fileinfo.name);
                //files.push_back(p.assign(path).append("\\").append(fileinfo.name));
            }
        } while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
 }

4、只讀取某給定路徑下的所有檔名(即包含當前目錄及子目錄的檔案):

void getFilesAll(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) {
                   //files.push_back(p.assign(path).append("\\").append(fileinfo.name));
                   getFilesAll(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);
    }
 }

實踐可行,收藏。