当前位置: 移动技术网 > IT编程>开发语言>C/C++ > VC遍历访问目录下的文件

VC遍历访问目录下的文件

2019年05月03日  | 移动技术网IT编程  | 我要评论

新天翼之链私服,泥石流致民房被毁,笑话大全爆笑短的

访问目录文件夹下的文件是经常需要的操作,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的转换。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网