訪問目錄文件夾下的文件是經常需要的操作,C/C++和win32介面都沒有提供直接調用的函數。在這裡總結了幾個經常用到的函數,通過MFC的CFileFind函數遞歸遍歷實現,包括以下幾個功能函數: 1. 查找目錄下所有的文件夾; 2. 查找目錄下所有的文件(不遍歷目錄的目錄); 3. 查找目錄下所有的 ...
訪問目錄文件夾下的文件是經常需要的操作,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的轉換。