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 ...
随机推荐
- PyTorch官方教程中文版
首先呈上链接:http://pytorch123.com/ PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不 ...
- 洛谷 题解 CF299A 【Ksusha and Array】
本蒟蒻又双叒叕被爆踩辣! 这就是道大水题 首先,题目意思: 给你n个数,要你找这些数字中找到一个能够被这些所有数字整除的数,若有多个,可任意输出其中一个,其实答案只有一个,因为在大于等于自己的数中能被 ...
- oracle逻辑存储结构
oracle数据库管理系统有三个重要的概念:实例.数据库.数据库服务器.oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构.逻辑存储结构用于描绘Oracle内部组织和管理数据的方式,而物理 ...
- 【集合系列】- 深入浅出的分析 Set集合
一.摘要 关于 Set 接口,在实际开发中,其实很少用到,但是如果你出去面试,它可能依然是一个绕不开的话题. 言归正传,废话咱们也不多说了,相信使用过 Set 集合类的朋友都知道,Set集合的特点主要 ...
- 大数据之Linux基础
回顾这一个多月以来闭关学大数据的一些相关重要知识,就当复习,顺便以备以后查看 Linux学习第一步自然是安装Linux. 关于Linux 首先介绍下Linux,Linux系统很多程序员开发者其实都耳熟 ...
- 使用 Zookeeper 的 Api 实现服务注册
创建常量接口 com.bjsxt.constant.Constants package com.bjsxt.constant; public interface Constants { //访问Zoo ...
- 2017 ACM/ICPC 沈阳 F题 Heron and his triangle
A triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integer ...
- POJ2528 Mayor's poster
The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...
- numpy sum axis详解
axis 先看懂numpy.argmax的含义.那么numpy.sum就非常好理解. 看一维的例子. import numpy as np a = np.array([1, 5, 5, 2]) pri ...
- Appium之环境搭建
Appium:是开源.跨平台.多语言支持的移动应用自动化工具 测试对象主要有:① 原生app ② 混合app(h5 + web前端基础) ③ 移动web app 测试对象APPy运行平台: ① io ...