訪問目錄文件夾下的文件是常常須要的操做,C/C++和win32接口都沒有提供直接調用的函數。在這裏總結了幾個常常用到的函數,經過MFC的CFileFind函數遞歸遍歷實現,包括如下幾個功能函數:函數
//查找目錄下全部的文件夾 void FindFolder(string dir, vector<string> &folderPath) { CFileFind fileFinder; CString filePath = CString(dir.c_str()) + _T("\\*.*"); BOOL bFinished = fileFinder.FindFile(filePath); while (bFinished) //每次循環對應一個類別目錄 { bFinished = fileFinder.FindNextFile(); if (fileFinder.IsDirectory() && !fileFinder.IsDots()) //fileFinder.IsDots()識別"."文件和".."文件 { CString filePath = fileFinder.GetFilePath(); folderPath.push_back(filePath.GetBuffer()); filePath.ReleaseBuffer(); } } fileFinder.Close(); } //查找目錄下全部的文件(不遍歷目錄的目錄) void FindDirFileNoFormat(string dir, vector<string> &filePath) { CFileFind fileFinder; CString path = CString(dir.c_str()) + _T("\\*.*"); BOOL bFinished = fileFinder.FindFile(path); while (bFinished) //每次循環對應一個類別目錄 { bFinished = fileFinder.FindNextFile(); if (fileFinder.IsDirectory() || fileFinder.IsDots()) //fileFinder.IsDots()識別"."文件和".."文件 { continue; } else { CString findPath = fileFinder.GetFilePath(); filePath.push_back(findPath.GetBuffer()); findPath.ReleaseBuffer(); } } fileFinder.Close(); } //查找目錄下全部的文件(遍歷目錄的目錄) void FindAllFileNoFormat(string dir, vector<string> &filePath) { CFileFind fileFinder; CString path = CString(dir.c_str()) + _T("\\*.*"); BOOL bFinished = fileFinder.FindFile(path); while (bFinished) //每次循環對應一個類別目錄 { bFinished = fileFinder.FindNextFile(); // 跳過 . 和 .. ; 不然會陷入無限循環中!!! if (fileFinder.IsDots()) { continue; } // if (fileFinder.IsDirectory()) { CString findPath = fileFinder.GetFilePath(); string subdir = findPath.GetBuffer(); FindAllFileNoFormat(subdir, filePath); findPath.ReleaseBuffer(); } else { CString findPath = fileFinder.GetFilePath(); filePath.push_back(findPath.GetBuffer()); findPath.ReleaseBuffer(); } } fileFinder.Close(); } // 查找目錄下某一類型文件 (不遍歷目錄的目錄) void FindDirFile(string dir, string format, vector<string> &filePath) { CFileFind fileFinder; CString path = CString(dir.c_str()) + _T("\\*") + CString(format.c_str()); BOOL bFinished = fileFinder.FindFile(path); while (bFinished) //每次循環對應一個類別目錄 { bFinished = fileFinder.FindNextFile(); if (fileFinder.IsDirectory() && !fileFinder.IsDots()) //fileFinder.IsDots()識別"."文件和".."文件 { continue; } else { CString findPath = fileFinder.GetFilePath(); filePath.push_back(findPath.GetBuffer()); findPath.ReleaseBuffer(); } } fileFinder.Close(); } //獲得文件路徑的格式後綴 string GetPathFormat(string filePath) { string format = filePath; size_t p = filePath.find_last_of('.'); if (p == -1) { return string(); } format.erase(0, p); return format; } // 查找目錄下某一類型文件 (遍歷目錄的目錄) void FindDirAllFileEx(string dir, vector<string> &format, vector<string>& filePath) { CFileFind fileFinder; CString path = CString(dir.c_str()) + _T("\\*.*"); BOOL bFinished = fileFinder.FindFile(path); while (bFinished) //每次循環對應一個類別目錄 { bFinished = fileFinder.FindNextFile(); // 跳過 . 和 .. ; 不然會陷入無限循環中!!! if (fileFinder.IsDots()) { continue; } if (fileFinder.IsDirectory()) { CString findPath = fileFinder.GetFilePath(); string subdir = findPath.GetBuffer(); FindDirAllFileEx(subdir, format, filePath); findPath.ReleaseBuffer(); } else { //獲取文件類型 CString findPath = fileFinder.GetFilePath(); string file = findPath.GetBuffer(); string postfix = GetPathFormat(file); bool flag = false; for (auto it : format) { if (_stricmp(it.c_str(), postfix.c_str()) == 0) { flag = true; break; } } if (flag) { filePath.push_back(file); } findPath.ReleaseBuffer(); } } fileFinder.Close(); }
有一點值得注意的是我這裏函數的參數都封裝成STL的string,在多字節下能夠直接使用,在unicode下須要稍微修改下CString與string的轉換。post