MFC遍历文件夹

时间:2022-10-27 12:27:59

遍历文件夹下所有文件


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文件的读写操作
        }
    }
}