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++遍历文件夹中的文件的更多相关文章

  1. python 遍历文件夹中所有文件

    '''使用walk方法递归遍历目录文件,walk方法会返回一个三元组,分别是root.dirs和files. 其中root是当前正在遍历的目录路径:dirs是一个列表,包含当前正在遍历的目录下所有的子 ...

  2. java基础 File 递归删除文件夹中所有文件文件夹 目录(包含子目录)下的.java文件复制到e:/abc文件夹中, 并统计java文件的个数

    File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录 ...

  3. python遍历文件夹中所有文件夹和文件,os.walk

    python中可以用os.walk来遍历某个文件夹中所有文件夹和文件. 例1: import os filePath = 'C:/Users/admin/Desktop/img' for dirpat ...

  4. 基于Python——实现两个文件夹中的文件拷贝

    [背景]当复制一个文件夹中的某文件到另一个文件夹中时是一件很容易的事情,可是如果存在很多文件夹中的文件需要一一拷贝,就会变的很繁琐,稍有不慎就会遗漏,今天就用Python来解决这个问题—— [代码实现 ...

  5. C++获取文件夹中所有文件

    获取文件夹中的文件,用到过很多次,每次用的时候都要去查下,很烦,所以想自己写下,当然,借鉴了很多其他大佬的博客 主要实现的函数,如下: void getFiles( string path, vect ...

  6. Python列出文件夹中的文件

    几乎所有的关于操作系统的内容可以在python 官方文档中找到:https://docs.python.org/3/library/os.html#module-os 其中os.path被单独列出:h ...

  7. python将test01文件夹中的文件剪切到test02文件夹中

    将test01文件夹中的文件剪切到test02文件夹中 import shutil import os def remove_file(old_path, new_path): print(old_p ...

  8. cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件

    cocos项目导入其它源文件时加入依赖库时,头文件提示找不到文件夹中的文件解决方法: 选择项目属性->c/c++->常规,在附加包括项目中加上对应的文件夹 cocos test项目的库(所 ...

  9. 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同

    在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...

随机推荐

  1. mysql path妙用

    CREATE TABLE `lc_c_user_path` ( `id` INT ( ) UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` VARCHAR ( ) ...

  2. 使用forin循环时的注意事项

    由于遍历的对象为nil,从而导致的现象是里面的循环体根本就没有执行,并且编译器和运行期都不会报错.因为,OC语法是运行向nil发送消息的. for (WSFActivitySelectSpaceCel ...

  3. WebGL 渲染管线

    WebGL 是以 OpenGL ES 2.0 为基础的 3D 编程应用接口. WebGL依赖GPU的图形渲染能力,即依赖硬件设备,所以其渲染流程和GPU内部的渲染管线是相符的.渲染管线的作用是将3D模 ...

  4. Flutter 使用json_model解析json生成dart文件

    一.json_serializable使用步骤 1.集成json_serializable pubspec.yaml 添加以下依赖 dependencies: json_annotation: ^2. ...

  5. JS截取腾讯视频和去除视频广告

    一:腾讯视频截取 H5视频播放除了video标签以外,还有iframe嵌套视频 项目需求是用户输入腾讯视频的html链接,如 https://v.qq.com/x/page/y0116k2vspw.h ...

  6. 「译」forEach循环中你不知道的3件事

    前言 本文925字,阅读大约需要7分钟. 总括: forEach循环中你不知道的3件事. 原文地址:3 things you didn't know about the forEach loop in ...

  7. acid-事务的原子性、一致性、隔离性、持久性

    博客分类: oracle-dba   原子性  多个事情组成一个单元,要么同时成功或失败,不能只运行其中一个 一致性  事务处理要将数据库从一种状态转变为另一种状态. 一旦提交了修改数据,那么其它人读 ...

  8. ROS-3 : Catkin工作空间和ROS功能包

    一.创建一个Catkin工作空间 步骤一:构建catkin工作空间 安装完成ROS版本后,设置好环境变量:$ source /opt/ros/kinetic/setup.bash.然后即可创建一个ca ...

  9. JS实现全选,取消全选,正常选择

    //点击选择方法 onUserIdsChange(selVal) { if (this.form.groupUserIds.includes(-1) && !this.isSelect ...

  10. 吴裕雄--天生自然JAVAIO操作学习笔记:字节流与字符流操作

    import java.io.* ; public class Copy{ public static void main(String args[]){ if(args.length!=2){ // ...