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

VC遍历访问目录下的文件的更多相关文章

  1. C#.NET中遍历指定目录下的文件(及所有子目录及子目录里更深层目录里的文件)

    //遍历一个目录下所有的文件列表,代码实例 DirectoryInfo dir = new DirectoryInfo(folderName);var list = GetAll(dir); /// ...

  2. Windows下遍历某目录下的文件

    需求:要求遍历某个目录下的所有文件,文件夹 之前遇到过一些参考程序,其中有一种方法只能遍历 FAT32 格式的目录, 无法遍历NTFS的目录.

  3. java-IO流(File对象-深度遍历指定目录下的文件夹和文件)

    需求:遍历这个树状结构 File(String pathname) '\\'为了转义'\' // 通过抽象路径pathname 创建一个新的文件或者目录 File parent = new File( ...

  4. OpenCV代码提取:遍历指定目录下指定文件的实现

    前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...

  5. node遍历给定目录下特定文件,内容合并到一个文件

    遍历目录用了fs.readdir这个异步方法,得到当前目录下所有的文件和目录的一个数组.然后判断: if文件,并且后缀符合设定的规则(本文例子是符合后缀ts,js)直接用同步方法写入, if目录,继续 ...

  6. Lua 遍历Linux目录下的文件夹

    代码如下,里面有注释,应该能看懂. function getFile(file_name) local f = assert(io.open(file_name, 'r')) local string ...

  7. windows代码,传入文件名,遍历此目录下所有文件.

    #include <windows.h> #include <vector> using namespace std; BOOL IterAtorFileSaveFile(IN ...

  8. java 遍历指定目录下的文件夹并查找包含指定关键字的文件

    输入指定关键字,在制定目录中查找包含关键字的文件,返回包含指定关键字的文件路径. package net.xsoftlab.baike; import java.io.File; import jav ...

  9. java递归遍历获取目录下所有文件

    import java.io.File; import java.util.ArrayList; import java.util.List; public class GetFiles { Arra ...

随机推荐

  1. 关于TC297的Flash写入之前是否需要先擦除的问题

    通过实际测试,对TC297 Flash的一个地址空间可以重复执行写入操作(program),而不需要先对该区域所在扇区进行擦除. MPC5675K则需要在写入之前进行擦除.

  2. Flink入门(三)——环境与部署

    flink是一款开源的大数据流式处理框架,他可以同时批处理和流处理,具有容错性.高吞吐.低延迟等优势,本文简述flink在windows和linux中安装步骤,和示例程序的运行,包括本地调试环境,集群 ...

  3. 解决 Docker Hadoop ssh "Connection to * closed".问题

    Docker 最近很火, 可以快速轻量级地虚拟出多个node,所以打算在Docker中跑Hadoop伪分布式应用. 其实要做出个简单的版本倒是不难,主要在 建立ssh无密码登录本机时,出现刚登录上去, ...

  4. 求局域网内所有在线主机的ip

    在一个局域网内,已知其中一台主机的ip为192.,子网掩码为255.,求所有其他在线主机的ip. shell 编码实现 #!/bin/bash netWorkIP=. ) do $netWorkIP$ ...

  5. 【Elasticsearch 7 探索之路】(五)搜索相关 Search-API

    本节主要讲解 Elasticsearch 的 搜索相关功能 Search-API,讲解什么是 URL Search 和 Request Body Search 的语法,对常用的语法都会一一进行详细介绍 ...

  6. APP Distribution Guide 苹果官网

    https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduct ...

  7. Dubbo初步

    Dubbo 介绍 : Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成.Dubbo 框架,是基于容器 ...

  8. CoderForces999D-Equalize the Remainders

    D. Equalize the Remainders time limit per test 3 seconds memory limit per test 256 megabytes input s ...

  9. NIO-Channel接口分析

    目录 NIO-Channel源码分析 目录 前言 接口 SCTP协议 UDP协议 TCP协议 文件 总结 相关文献 NIO-Channel源码分析 目录 NIO-概览 NIO-Buffer NIO-C ...

  10. git 多仓库源 配置

    在后台配好ssh公匙后 在C:\Users\Administrator\.ssh 下修改config文件  就叫config不带后缀 若没有则新建 配置SSH 密匙 # 配置github.com Ho ...