MFC遍历目录包括子目录下所有文件、特定类型文件

⌚Time: 2023-08-04 00:06:59

👨‍💻Author: Jack Ge

用法


vector<CString> v;

//获取所有文件

GetFilePath(v,L"D:\\test\\");

//文件路径储存在容器里面,遍历容器

for(int i=0;i<v.size();i++){

    //文件操作

}

//获取所有txt文件

vector<CString> vv;

GetTxtFilePath(vv,L"D:\\test\\");

//文件路径储存在容器里面,遍历容器

for(int i=0;i<vv.size();i++){

    //文件操作

}

实现

遍历所有文件




void GetFilePath(vector<CString>& vFilePathList, CString strDir)

{

    CFileFind finder;

    BOOL isNotEmpty = finder.FindFile(strDir + _T("*"));//总文件夹,开始遍历 

    while (isNotEmpty)

    {

        isNotEmpty = finder.FindNextFile();//查找文件 

        CString filename = finder.GetFilePath();//获取文件的路径,可能是文件夹,可能是文件 

        if (!(finder.IsDirectory()))

        {

            //如果是文件则加入文件列表 



                vFilePathList.push_back(filename);//将一个文件路径加入容器 



        }

        else

        {

            //递归遍历用户文件夹,跳过非用户文件夹 

            if (!(finder.IsDots() || finder.IsHidden() || finder.IsSystem() || finder.IsTemporary() || finder.IsReadOnly()))

            {

                GetFilePath(vFilePathList, filename + _T("/"));

            }

        }

    }

}

遍历所有txt文件




void GetTxtFilePath(vector<CString>& vFilePathList, CString strDir)

{

    CFileFind finder;

    BOOL isNotEmpty = finder.FindFile(strDir + _T("*"));//总文件夹,开始遍历 

    while (isNotEmpty)

    {

        isNotEmpty = finder.FindNextFile();//查找文件 

        CString filename = finder.GetFilePath();//获取文件的路径,可能是文件夹,可能是文件 

        if (!(finder.IsDirectory()))

        {

            //如果是文件则加入文件列表 

            if (!filename.Right(4).Compare(L".txt")){



                vFilePathList.push_back(filename);//将一个文件路径加入容器 

            }

        }

        else

        {

            //递归遍历用户文件夹,跳过非用户文件夹 

            if (!(finder.IsDots() || finder.IsHidden() || finder.IsSystem() || finder.IsTemporary() || finder.IsReadOnly()))

            {

                GetTxtFilePath(vFilePathList, filename + _T("/"));

            }

        }

    }

}

递归获取目录下所有特定类型文件


    void get_all_support_image_in_dir(CString directory, std::vector<CString> &list){

        //路径结尾是斜线

        if (directory.Right(1).Compare(L"/") && directory.Right(1).Compare(L"\\")){

            directory += "\\";

        }

        //

        CString searchPath = directory + L"*";



        WIN32_FIND_DATA fileData;

        HANDLE handle = FindFirstFile(searchPath, &fileData);



        if (handle == INVALID_HANDLE_VALUE) {

            return;

        }



        do {

            CString fileName = fileData.cFileName;

            const bool is_directory = fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;



            if (fileName[0] == L'.') {//是本目录.或者上级目录..则跳过

                continue;

            }

            if (is_directory) {//是子目录

                //递归查找

                get_all_support_image_in_dir(directory + fileName + L"\\", list);

            }

            else {//是文件

                CString suffix[3] = { L".jpg", L".jpeg", L".png"};

                for (auto suf : suffix){

                    if (!fileName.Right(suf.GetLength()).Compare(suf)) {

                        list.push_back(directory + fileName);

                        break;

                    }

                }

            }

        } while (FindNextFile(handle, &fileData) != 0);



        FindClose(handle);

    }