Windows下C++遍历文件夹中的文件
Windows下,在VS中开发,C++遍历文件夹下文件。
在Windows下,遍历文件所用到的函数和结构体,需要在程序中包含头文件#include <io.h>,在VS中,头文件io.h实际上是包含了另一个头文件corecrt_io.h的,所以需要用到的函数和结构体也都是包含在corecrt_io.h这个头文件中的。
首先是遍历文件的时候用于存储文件信息的结构体_finddata_t,_finddata_t在头文件中是一个宏定义:
#define _finddata_t _finddata64i32_t
而_finddata64i32_t的结构体定义如下:
struct _finddata64i32_t
{
unsigned attrib;
__time64_t time_create; // -1 for FAT file systems
__time64_t time_access; // -1 for FAT file systems
__time64_t time_write;
_fsize_t size;
char name[260];
};
也就是这个结构体中包含了六个信息,文件属性(attrib),创建时间(time_create),最近访问时间(time_access)、最近写入时间(time_write)、文件大小(size)和文件名(name)。文件属性有以下几种:
#define _A_NORMAL 0x00 // Normal file - No read/write restrictions,普通文件,无读写限制
#define _A_RDONLY 0x01 // Read only file,只读文件
#define _A_HIDDEN 0x02 // Hidden file,隐藏文件
#define _A_SYSTEM 0x04 // System file,系统文件
#define _A_SUBDIR 0x10 // Subdirectory,子目录
#define _A_ARCH 0x20 // Archive file,存档文件
之后要遍历文件夹,需要用到三个函数_findfirst、_findnext、_findclose,前两个是宏定义,指向了两个函数:
#define _findfirst _findfirst64i32
#define _findnext _findnext64i32
1、_findfirst的函数声明为:
_Success_(return != -1) _Check_return_ _ACRTIMP intptr_t __cdecl _findfirst64i32( _In_z_ char const* _FileName, _Out_ struct _finddata64i32_t* _FindData );
这个函数是查找符合条件的第一个实例,第一个参数_FileName是一个通配符,可以是”*.*”或者”xxxxx.*”,或者”xxxxxx/*”,或者”*.txt”等方式,第二个参数_FindData则是用于存储当前查找到的文件的信息。如果查找成功则返回intptr_t类型的句柄,该句柄不是指针,而是
typedef int intptr_t;
如果失败,返回-1,成功则返回句柄。
2、_findnext的函数声明为:
_Success_(return != -1) _Check_return_ _ACRTIMP int __cdecl _findnext64i32( _In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t* _FindData );
函数是查找句柄的下一个符合条件的实例,输入变量_FindHandle就是当前的句柄,_FindData则是下一个句柄的实例的文件信息,失败返回-1, 成功返回0。
3、_findclose的函数声明为:
_Check_return_opt_ _ACRTIMP int __cdecl _findclose( _In_ intptr_t _FindHandle );
则是根据句柄关闭查找,成功返回0,失败返回-1;
例子:
#include <io.h>
void getFiles(std::string path, std::vector<std::string>& files, std::vector<std::string>& names)
{
//文件句柄,win10用long long,win7用long就可以了
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
std::string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录,迭代之 //如果不是,加入列表
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
getFiles(p.assign(path).append("\\").append(fileinfo.name), files, names);
}
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
names.push_back(fileinfo.name);
}
}while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
觉来窗牖空,寥落雨声晓。
良游怨迟暮,末事惊纷扰。
为问经世心,古人难尽了。
-- 柳宗元 《独觉》
Windows下C++遍历文件夹中的文件的更多相关文章
- python 遍历文件夹中所有文件
'''使用walk方法递归遍历目录文件,walk方法会返回一个三元组,分别是root.dirs和files. 其中root是当前正在遍历的目录路径:dirs是一个列表,包含当前正在遍历的目录下所有的子 ...
- java基础 File 递归删除文件夹中所有文件文件夹 目录(包含子目录)下的.java文件复制到e:/abc文件夹中, 并统计java文件的个数
File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录 ...
- python遍历文件夹中所有文件夹和文件,os.walk
python中可以用os.walk来遍历某个文件夹中所有文件夹和文件. 例1: import os filePath = 'C:/Users/admin/Desktop/img' for dirpat ...
- 基于Python——实现两个文件夹中的文件拷贝
[背景]当复制一个文件夹中的某文件到另一个文件夹中时是一件很容易的事情,可是如果存在很多文件夹中的文件需要一一拷贝,就会变的很繁琐,稍有不慎就会遗漏,今天就用Python来解决这个问题—— [代码实现 ...
- C++获取文件夹中所有文件
获取文件夹中的文件,用到过很多次,每次用的时候都要去查下,很烦,所以想自己写下,当然,借鉴了很多其他大佬的博客 主要实现的函数,如下: void getFiles( string path, vect ...
- Python列出文件夹中的文件
几乎所有的关于操作系统的内容可以在python 官方文档中找到:https://docs.python.org/3/library/os.html#module-os 其中os.path被单独列出:h ...
- python将test01文件夹中的文件剪切到test02文件夹中
将test01文件夹中的文件剪切到test02文件夹中 import shutil import os def remove_file(old_path, new_path): print(old_p ...
- cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件
cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件解决方法: 选择项目属性->c/c++->常规,在附加包括项目中加上对应的文件夹 cocos test项目的库(所 ...
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
随机推荐
- golang自定义error
系统自身的error处理一般是 errors.New()或fmt.Errorf()等,对一些需要复杂显示的,不太友好,我们可以扩展下error. error在标准库中被定义为一个接口类型,该接口只有一 ...
- pycharm不能安装第三方库,错误代码Non-zero exit code (1) 的解决办法
pycharm版本 2019.3 大致意思是安装失败,建议的解决方案:尝试从系统终端运行此命令.确保使用正确的'pip'版本,该版本已为位于'C:\ Users \ G \ Desktoplgianf ...
- hdu 1541 Stars 统计<=x的数有几个
Stars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Pytorch【直播】2019 年县域农业大脑AI挑战赛---初级准备(一)切图
比赛地址:https://tianchi.aliyun.com/competition/entrance/231717/introduction 这次比赛给的图非常大5万x5万,在训练之前必须要进行数 ...
- 5G风口之下,NFV为何发展迅速
导读 5G高带宽.低时延.大容量的接入方式,注定它一定要依赖于跟以往完全不同的专业设备模式来实现,因此也创造了更多的方向和机会.NFV就是其中之一. 5G最大的变化在网络层面,需要底层网络架构形成一种 ...
- 第2节 storm实时看板案例:12、实时看板综合案例代码完善;13、今日课程总结
详见代码 将任务提交到集群上面去运行 apache-storm-1.1.1/bin/storm jar cn.itcast.storm.kafkaAndStorm.KafkTopology kafka ...
- JavaScript之bind方法实现代码分析
我们来分析一下bind方法的实现代码,下图的bind方法的实现为MDN(开发者社区)中的代码. 由上图可得:bind方法实现了两个功能:绑定this和科里化.
- 5.7 Nginx 其他模块
- Java注解浅谈
注解定义(来自百度百科):指示编译器如何对待您的自定义 Annotation,预设上编译器会将Annotation资讯留在class档案中,但不被虚拟机器读取,而仅用于编译器或工具程式运行时提供资讯. ...
- python实现PCA算法原理
PCA主成分分析法的数据主成分分析过程及python原理实现 1.对于主成分分析法,在求得第一主成分之后,如果需要求取下一个主成分,则需要将原来数据把第一主成分去掉以后再求取新的数据X’的第一主成分, ...