說起使用C++操作文件,最常見的是當(dāng)屬對(duì)單一文件進(jìn)行讀寫了,但有時(shí)我們需要一個(gè)目錄下的所有文件又該怎么快速獲取呢?
這個(gè)問題的難點(diǎn)在于如何查找文件目錄下的文件及其數(shù)量,以及如何遞歸查找目錄下的子目錄的文件及其數(shù)量。
我一下子就懵了,趕緊打開搜索引擎,在互聯(lián)網(wǎng)上找了一圈,發(fā)現(xiàn)核心代碼幾乎都是同一段(原作者已不可考究):
#include <iostream> #include <string> #include <vector> //注意這個(gè)頭文件 #include <io.h> using namespace std; //核心函數(shù) void getFileNames(string path, vector<string>& files); int main(){ vector<string> fileNames; string path("D:\\test"); //自己選擇目錄測試 getFileNames(path, fileNames); for (const auto &ph : fileNames) { std::cout << ph << "\n"; } return 0; } //核心代碼 void getFileNames(string path, vector<string>& files) { //文件句柄 //注意:我發(fā)現(xiàn)有些文章代碼此處是long類型,實(shí)測運(yùn)行中會(huì)報(bào)錯(cuò)訪問異常 intptr_t hFile = 0; //文件信息 struct _finddata_t fileinfo; string p; if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) { do { //如果是目錄,遞歸查找 //如果不是,把文件絕對(duì)路徑存入vector中 if ((fileinfo.attrib & _A_SUBDIR)) { if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) getFileNames(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); } }
筆者在Visual Studio 2017中測試結(jié)果如下:
輸入路徑:D:\\test(或者D:/test),文件分布為如圖:
輸出結(jié)果:
想必你也注意到了 #include <io.h> 這條語句,看起來不太像C/C++標(biāo)準(zhǔn)庫(C++標(biāo)準(zhǔn)庫一般沒有.h,在C++使用C標(biāo)準(zhǔn)庫一般是cxxx,例如cstdio),而且getFilesNames里面用了大量該文件中的宏。在VS中打開該文件,有一些簡單的注釋(不知所云):
// io.h // // Copyright (c) Microsoft Corporation. All rights reserved. // // This file declares the low-level I/O and file handling functionality.
但是這里使用**#include <io.h>** 而不是**#include “io.h”** 說明 io.h 這個(gè)頭文件在編譯器的默認(rèn)搜索路徑,而不在當(dāng)前項(xiàng)目路徑。據(jù)查, 關(guān)于這個(gè)io.h的信息很少,但可以肯定的是它并不是標(biāo)準(zhǔn)C/C++語言的頭文件,我用everythig搜索了該名字,發(fā)現(xiàn)在我電腦上以下路徑: D:\Windows Kits\10\Include\10.0.17763.0\ucrt\io.h.
ucrt:就是Universal C Runtime 庫,即,通用C運(yùn)行時(shí)庫,包含眾多C的頭文件。
ucrt目前已經(jīng)成為Windows組之一,從Windows 10開始作為操作系統(tǒng)的一部分提供。對(duì)應(yīng)的lib庫為libucrt.lib,對(duì)應(yīng)的dll庫為ucrtbase.dll
所以 io.h 應(yīng)該是個(gè)VC運(yùn)行時(shí)(runtime)庫,使用它可能在跨平臺(tái)(unix/linux)上會(huì)有問題,謹(jǐn)慎使用。
目前也沒找到更好的讀取某一目錄下的文件信息的方式,如果有知道的小伙伴可以在評(píng)論區(qū)賜教哦~
原創(chuàng)文章,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明本文鏈接:https://blog.csdn.net/Love_Point/article/details/109209154注意百度和各類采集站皆不可信,搜索時(shí)請謹(jǐn)慎甄別。同時(shí)由于文章一般都有時(shí)效性,本人可能會(huì)不定期對(duì)自己的博文進(jìn)行修正和更新,因此敬請?jiān)L問出處以查看最新版本。
聯(lián)系客服