VC遍历访问目录下的文件
访问目录文件夹下的文件是经常需要的操作,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的转换。
VC遍历访问目录下的文件的更多相关文章
- C#.NET中遍历指定目录下的文件(及所有子目录及子目录里更深层目录里的文件)
//遍历一个目录下所有的文件列表,代码实例 DirectoryInfo dir = new DirectoryInfo(folderName);var list = GetAll(dir); /// ...
- Windows下遍历某目录下的文件
需求:要求遍历某个目录下的所有文件,文件夹 之前遇到过一些参考程序,其中有一种方法只能遍历 FAT32 格式的目录, 无法遍历NTFS的目录.
- java-IO流(File对象-深度遍历指定目录下的文件夹和文件)
需求:遍历这个树状结构 File(String pathname) '\\'为了转义'\' // 通过抽象路径pathname 创建一个新的文件或者目录 File parent = new File( ...
- OpenCV代码提取:遍历指定目录下指定文件的实现
前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...
- node遍历给定目录下特定文件,内容合并到一个文件
遍历目录用了fs.readdir这个异步方法,得到当前目录下所有的文件和目录的一个数组.然后判断: if文件,并且后缀符合设定的规则(本文例子是符合后缀ts,js)直接用同步方法写入, if目录,继续 ...
- Lua 遍历Linux目录下的文件夹
代码如下,里面有注释,应该能看懂. function getFile(file_name) local f = assert(io.open(file_name, 'r')) local string ...
- windows代码,传入文件名,遍历此目录下所有文件.
#include <windows.h> #include <vector> using namespace std; BOOL IterAtorFileSaveFile(IN ...
- java 遍历指定目录下的文件夹并查找包含指定关键字的文件
输入指定关键字,在制定目录中查找包含关键字的文件,返回包含指定关键字的文件路径. package net.xsoftlab.baike; import java.io.File; import jav ...
- java递归遍历获取目录下所有文件
import java.io.File; import java.util.ArrayList; import java.util.List; public class GetFiles { Arra ...
随机推荐
- 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)
搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...
- gdb调试常用方法介绍
一.概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.没有统一的界面,所有的操作都是通过命令的方式进行提供.对于习惯了图形界面方式进行调试的猿猿来说可能不是很顺手,但是如果你在 ...
- 洛谷 题解 P3173 【[HAOI2009]巧克力】
本蒟蒻又双叒叕被爆踩辣! 又是一道经典的贪心题: 那么怎样切割该块巧克力,花费的代价最少呢? Solution: 窝们考虑每个状态,有多少种选择方法? 是不是可以选择横着切或者竖着切,就这两种方法吧: ...
- 2017 ACM/ICPC 沈阳 L题 Tree
Consider a un-rooted tree T which is not the biological significance of tree or plant, but a tree as ...
- SQL Server 2019 深度解读:微软数据平台的野望
本文为笔者在InfoQ首发的原创文章,主要利用周末时间陆续写成,也算近期用心之作.现转载回自己的公众号,请大家多多指教. 11 月 4 日,微软正式发布了其新一代数据库产品 SQL Server 20 ...
- django学习01-建project和app
按装完成后,执行命令 django-admin startproject mysite 建一个名字为mysite的工程.运行 python manage.py runserver 启动网络服务器,然后 ...
- 笔记||Python3之算法
循环嵌套:先从外层循环里面取出一个元素,再执行内层的循环:当内层的循环都执行后,再执行外层循环. for循环嵌套语法: for x in range(): for y in range() ...
- Bootstrap响应式栅格系统设计
为了方便起见,我们通过1200px宽的屏幕来讲解bootstrap中container.row.col的css属性值为何这样设置的原理 在1200px屏幕中为何container的宽度设置为1170p ...
- Python3 网络编程小练习
三次握手.四次挥手图示意图 基于TCP开发一款远程cmd程序 # server.py import socket import subprocess server = socket.socket() ...
- 【CentOS7】开发环境配置
[CentOS7]开发环境配置 目录 ===================================================================== 1.安装openjdk ...