C++遍歷路徑下的所有文件
阿新 • • 發佈:2017-10-30
highlight true file bsp char 函數 cmp ron 標識
intptr_t類型用於記錄文件夾句柄,註意該類型不是指針類型,而是int型的重定義。
_finddata_t結構體類型用於記錄文件信息。
_finddata_t結構體定義如下
struct _finddata_t {
unsigned attrib; // 存儲文件屬性
__time64_t time_create; // 存儲文件創建時間
__time64_t time_access; // 存儲文件最後一次被訪問的時間
__time64_t time_write; // 存儲文件最後一次被修改的時間
_fsize_t size; // 存儲文件的大小
char name[260]; // 存儲文件名稱
};
_findfirst()函數
_findfirst()函數原型如下:
intptr_t _findfirst(
const char *filespec, // 目標文件
struct _finddata_t *fileinfo // 用於存儲文件信息的_finddata_t結構體
);
函數如果成功,返回一個唯一的搜索句柄標識一個或一組和filespec說明匹配的文件,可以用於接下來的_findnext()和_findclose()函數。
否則_findfirst()返回-1。
_findnext()函數
_findnext()函數原型如下:
int _findnext(
intptr_t handle, // 搜索句柄,通過_findfirst()函數獲得 struct _finddata_t *fileinfo // 用於存儲文件信息的_finddata_t結構體 );
函數如果成功,返回0,否則返回-1。如果沒有更多能夠找到的文件了,也會導致失敗。
_findclose()函數
原型如下:
int _findclose( intptr_t handle // 搜索句柄 );
該函數用於關閉搜索句柄
代碼如下:
void CDlg::OnBnClickedOk() { // TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE); m_ListFile.ResetContent(); // 寬字節轉多字節 char *pPathBuf = NULL; int PathBufSize = WideCharToMultiByte(0, 0, m_szPath.GetBuffer(), m_szPath.GetLength(), pPathBuf, 0, NULL, NULL); if (PathBufSize <= 0) m_ListFile.AddString(_T("獲取多字節緩沖區大小錯誤")); pPathBuf = new char[PathBufSize + 1]; memset(pPathBuf, 0, PathBufSize + 1); WideCharToMultiByte(0, 0, m_szPath.GetBuffer(), m_szPath.GetLength(), pPathBuf, PathBufSize + 1, 0, 0); if (strlen(pPathBuf) <= 0) m_ListFile.AddString(_T("寬字節轉多字節錯誤")); queue<string> *pVect = new queue<string>; if (GetPathFile(pPathBuf, pVect) == false) m_ListFile.AddString(_T("遍歷目錄下的所有文件失敗!")); else{ while (!pVect->empty()) { string szFileName = pVect->front(); LPWSTR pBuf = NULL; int nLen = MultiByteToWideChar(0, 0, (char*)szFileName.c_str(), szFileName.length(), pBuf, 0); if (nLen > 0) { pBuf = new TCHAR[nLen + 1]; memset(pBuf, 0, sizeof(TCHAR)* (nLen + 1)); MultiByteToWideChar(0, 0, (char*)szFileName.c_str(), szFileName.length(), pBuf, nLen); m_ListFile.AddString(pBuf); delete[] pBuf; pBuf = NULL; } pVect->pop(); } } delete[] pPathBuf; pPathBuf = NULL; UpdateData(FALSE); } bool CDlg::GetPathFile(const char* pPath, queue<string> *pVect) { if (!pPath || !pPath) return false; char* szPath = new char[128]; memset(szPath, 0, 128); _snprintf_s(szPath, 128, 128, "%s\\*.*", pPath); intptr_t Handle; _finddata_t FindData; Handle = _findfirst(szPath, &FindData); if (Handle == -1) return false; do { if (strcmp(FindData.name, ".") != 0 && strcmp(FindData.name, "..") != 0) { pVect->push(FindData.name); if (strrchr(FindData.name, ‘.‘) == NULL) { string sz = pPath; sz += "\\"; sz += FindData.name; GetPathFile(sz.c_str(), pVect); } } } while (_findnext(Handle, &FindData) == 0); _findclose(Handle); delete[] szPath; szPath = NULL; return true; }
C++遍歷路徑下的所有文件