欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

VC遍历访问目录下的文件

程序员文章站 2022-06-06 22:19:47
访问目录文件夹下的文件是经常需要的操作,C/C++和win32接口都没有提供直接调用的函数。在这里总结了几个经常用到的函数,通过MFC的CFileFind函数递归遍历实现,包括以下几个功能函数: 1. 查找目录下所有的文件夹; 2. 查找目录下所有的文件(不遍历目录的目录); 3. 查找目录下所有的 ......

访问目录文件夹下的文件是经常需要的操作,c/c++和win32接口都没有提供直接调用的函数。在这里总结了几个经常用到的函数,通过mfc的cfilefind函数递归遍历实现,包括以下几个功能函数:

  1. 查找目录下所有的文件夹;
  2. 查找目录下所有的文件(不遍历目录的目录);
  3. 查找目录下所有的文件(遍历目录的目录) ;
  4. 查找目录下某一类型文件 (不遍历目录的目录);
  5. 查找目录下某一类型文件 (遍历目录的目录);
//查找目录下所有的文件夹
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的转换。