C++讀取特定路徑下檔案目錄及檔名稱
阿新 • • 發佈:2018-12-20
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);
}
}
實踐可行,收藏。