VC遍历访问目录下的文件
程序员文章站
2023-09-09 18:37:39
访问目录文件夹下的文件是经常需要的操作,C/C++和win32接口都没有提供直接调用的函数。在这里总结了几个经常用到的函数,通过MFC的CFileFind函数递归遍历实现,包括以下几个功能函数: 1. 查找目录下所有的文件夹; 2. 查找目录下所有的文件(不遍历目录的目录); 3. 查找目录下所有的 ......
访问目录文件夹下的文件是经常需要的操作,c/c++和win32接口都没有提供直接调用的函数。在这里总结了几个经常用到的函数,通过mfc的cfilefind函数递归遍历实现,包括以下几个功能函数:
- 查找目录下所有的文件夹;
- 查找目录下所有的文件(不遍历目录的目录);
- 查找目录下所有的文件(遍历目录的目录) ;
- 查找目录下某一类型文件 (不遍历目录的目录);
- 查找目录下某一类型文件 (遍历目录的目录);
//查找目录下所有的文件夹 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的转换。
上一篇: PHP 事件机制(2)