MFC遍历文件夹

时间:2021-10-13 12:26:29

遍历文件夹下所有文件


MFC 的 CFileFind类 有个 FindFile 和 FindNextFile 函数,它既不会搜索兄弟目录, 不会搜索子目录的,但是提供了一个判断函数 CFileFind::IsDirectory(), 判断该文件夹下某个文件路径是不是目录,如果是目录的话,还得递归遍历。

CFileFind 查找文件夹下的文件时是需要全路径的。

void CXXXDlg::SearchFiles(CString strMusicFolder)
{
CFileFind ff;

strMusicFolder += _T("\\");

strMusicFolder += _T("*.*");

BOOL res = ff.FindFile(strMusicFolder);

while (res)
{
res = ff.FindNextFile();
if (!ff.IsDirectory() && !ff.IsDots())
{
afxMessageBox(ff.GetFilePath());
}
}
ff.Close();
}

遍历文件夹下指定格式文件


已知文件夹路径“D:\temp” ,要读取里面多个”.DAT”类型文件,并保存路径到strPath[ ] 数组中。

int i=0;
CString strPath[10];
CFileFind ff;
BOOL ret = ff.FindFile("d:\\temp\\*.DAT");
while(ret)
{
ret = ff.FindNextFile();
strPath[i++] = ff.GetFileName();
}
ff.Close();

注意:如果需要文件的绝对路径须将GetFileName换成GetFilePath

通过开启窗口选择指定格式文件


CString FilePathName;
LPCTSTR szFilter = L"nat files (*.nat)|*.nat| All Files (*.*)|*.*||";
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,szFilter);

if(dlg.DoModal()==IDOK)
FilePathName=dlg.GetPathName();
if(FilePathName.GetLength()==0) return;

MFC 深度优先方式递归遍历整个文件夹


findfile是CFileFind类的一个方法,你要为findfile指定一个path,然后不断调用CFILEFIND::FindNextFile去遍历你文件目录下的文件或者文件夹,对于如果遍历到了一个文件夹,那么可以通过CFindFile::IsDirectory来判断,你可以把当前目录下的文件夹一一与新建的文件夹比较名称。

void TraversFile(CString csPath)
{
CString csPrePath = csPath;
CString csNextPath = csPath;
CFileFind ff;
csPath += _T("*.*");//遍历这一级全部的目录
int nResult = ff.FindFile(csPath);
while(nResult)
{
nResult = ff.FindNextFileW();
if(ff.IsDirectory() && !ff.IsDots())
{
wcout << (LPCTSTR)ff.GetFilePath() << endl;
csNextPath += ff.GetFileName();
csNextPath += _T("\\");
TraversFile(csNextPath);
}
csNextPath = csPrePath;
}
}

由于windows程序设计中默认使用unicode编码,所以在使用控制台程序输出的时候,需要使用wcout来进行输出。

而使用wcout进行输出的时候,如果遇到了汉字,则会导致程序卡住,然后停止运行的情况。

解决方法是添加下面的函数调用:

setlocale(LC_ALL, “chs”);

using namespace std;
/*修改于20130625 做文件查找*/
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
setlocale(LC_ALL, "chs");
CString cs = _T("F:\\");
TraversFile(cs);
system("pause");
return 0;
}

只遍历两层



CString csPrePath = L"D:\\ECG_CAD\\test\\";
CString csNextPath = L"D:\\ECG_CAD\\test\\";
CFileFind fparent; //当前目录
CFileFind fchild; //子级目录
csPrePath += _T("*.*");
BOOL retfirst = fparent.FindFile(csPrePath); //遍历当前目录下的全部文件夹与文件

while(retfirst)
{
retfirst = fparent.FindNextFile();
if(fparent.IsDirectory() && !fparent.IsDots())
{
cout << fparent.GetFilePath() <<endl;
csNextPath = fparent.GetFilePath();
csNextPath += _T("\\*.dat"); //遍历子级文件夹中指定后缀格式文件(.dat)
BOOL retsecd = fchild.FindFile(csNextPath);
while(retsecd)
{
retsecd = fchild.FindNextFile();
cout << fchild.GetFilePath() <<endl;
// 加入你所需对.dat文件的读写操作
}
}
}