C++ 文件查找 _findfirst、_findnext和_fineclose的使用
来源:互联网 发布:剑三喵太捏脸数据 编辑:程序博客网 时间:2024/05/01 00:02
C++ 文件查找
在C++中我们要如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~ 首先讲这个结构体吧~
_finddata_t ,这个结构体是用来存储文件各种信息的。
在io.h中有如下的宏:
#ifdef _USE_32BIT_TIME_T#define _finddata_t _finddata32_t#define _finddatai64_t _finddata32i64_t……#else#define _finddata_t _finddata64i32_t#define _finddatai64_t __finddata64_t
大致意思是根据32位还是64位,用相应的数据类型定义的变量,其中一个结构体定义如下:
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];};
其中各部分变量的含义如下: unsigned atrrib
:
文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。
文件属性是用位表示的,主要有以下一些:
_A_ARCH(存档)_A_HIDDEN(隐藏)_A_NORMAL(正常)_A_RDONLY(只读)_A_SUBDIR(文件夹)_A_SYSTEM(系统)
之间可以用 | 运算来组合表示一个文件的属性:
例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
接着是三个表示时间的变量:
time_t time_create:
这个time_create变量是用来存储文件创建时间的,time_t 类型本质是就是一个整型。
time_t time_access:
文件最后一次被访问的时间。
time_t time_write:
文件最后一次被修改的时间。
然后是文件大小和文件名:
_fsize_t size:
文件的大小。这里的_fsize_t是unsigned long类型,表示文件的字节数。
char name[260]:
文件的文件名。
前面也说了,这个结构体是用来存储文件信息的,那么如何把一个硬盘文件的文件信息“存到”这个结构体所表示的内存空间里去呢?这就要靠_findfirst、_findnext和_fineclose三个函数的搭配使用了。 首先还是对这三个函数一一介绍一番吧……
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
返回值:
如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
参数:
filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。
fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。
函数成功后,函数会把找到的文件的信息放入这个结构体中。
int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:
若成功返回0,否则返回-1。
参数:
handle:即由_findfirst函数返回回来的句柄。
fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
int _findclose( long handle );
返回值:成功返回0,失败返回-1。
参数: handle :_findfirst函数返回回来的句柄。
大家看到这里,估计都能猜到个大概了吧?先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。
下面给出一个查找指定目录下,文件名符合匹配的模式的文件,并逐个打印出来。
#include<iostream>#include<string>#include<io.h>using namespace std;void filesearch(string path,string mode){ struct _finddata_t filefind; //用来存储文件各种信息的结构体 if(path[path.size()-1]=='\\') path.resize(path.size()-1); string curr=path+"\\"+mode;//欲查找的文件,支持通配符 int done=0,handle; handle=_findfirst(curr.c_str(),&filefind);//第一次查找 if(-1==handle) return; do{ if(!strcmp(filefind.name,".."))//若为上级目录,则跳过 continue; //---------process--------------- curr=path+"\\"+filefind.name; //if(strstr(filefind.name,mode.c_str())) cout<<curr<<endl; //------------------------------ if (_A_SUBDIR==filefind.attrib) filesearch(curr,mode);//递归查找子目录 }while(!(done=_findnext(handle,&filefind))); _findclose(handle); //别忘了关闭句柄 }void main(){ string path,mode; cout<<"请输入要搜的目录"<<endl; cin>>path; cout<<"请输入文件名模式"<<endl; cin>>mode; filesearch(path,mode);}
- C++ 文件查找 _findfirst、_findnext和_fineclose的使用
- _finddata_t和 _findfirst 和 _findnext 查找文件
- 用 _findfirst 和 _findnext 查找文件(转)
- 用 _findfirst 和 _findnext 查找文件(转)
- 用 _findfirst 和 _findnext 查找文件(转)
- 用 _findfirst 和 _findnext 查找文件
- 用 _findfirst 和 _findnext 查找文件
- 用 _findfirst 和 _findnext 查找文件(windows可用)
- 用 _findfirst 和 _findnext 查找文件(windows可用)
- <io.h> 用 _findfirst 和 _findnext 查找文件
- 用 _findfirst 和 _findnext 查找文件(windows可用)
- _chdir、_findfirst、_findnext、_findclose函数的使用(枚举文件)
- 使用_findfirst和_findnext遍历目录
- 使用_findfirst和_findnext遍历目录 分类
- C++下遍历文件夹,查找文件 _finddata_t _findfirst _findnext
- c++关于文件夹(文件)的相关操作_findfirst,_findnext和_findclose方法
- _findfirst _findnext _findclose 文件(夹)不能删除
- C++ 查找获取文件名相关函数和实现(_findfirst;_findnext;_findclose;_finddata_t)
- 浏览器插件之ActiveX开发(二)
- JedisPool介绍
- DB Oracle rownum
- 简易售票系统
- Swift中的typealias
- C++ 文件查找 _findfirst、_findnext和_fineclose的使用
- Locating Elements
- 只刷新某一行的数据
- httpclient调用cxf开发webservice接口以及jboss开发的webservice接口
- byte 常用转换
- Ubunt15.04 安装JDK 8
- 生产环境下JAVA进程高CPU占用故障排查
- 69 - Sqrt(x)
- Windows XP Embedded 上手指南