用FindFirstFile函数时,定义了相应的结构体函数定义,但是定义的变量却无法使用结构体函数定义中的成员

用 _findfirst 和 _findnext 查找文件(windows可用)
这两个函数均在io.h
文件结构体:
struct _finddata_t {
name[260];};
time_t,就是long
_fsize_t,就是unsigned long
attrib,是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。
size:文件大小
name:文件名。
long _findfirst(const char *, struct _finddata_t *);
第一个参数为文件名,可以用"*.*"来查找所有文件,也可以用"*.cpp"来查找.cpp文件。
第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。
int _findnext(long, struct _finddata_t *);
第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1。
int _findclose(long);
只有一个参数,文件句柄。若关闭成功返回0,失败返回-1。
没有更多推荐了,只想安静的搞技术
c++关于文件夹(文件)的相关操作_findfirst,_findnext和_findclose方法
获取windows下某文件下的所有文件,立即应用。
【说明】可以找到某文件下的任意类型的子文件夹和任意格式的文件,根据”*“来进行任意字符串的替代。
#include &iostream&
#include &string&
#include &io.h&
void main()
_finddata_
string tempN
//_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)
if ((longf = _findfirst("d://*.*", &file)) == -1l)
cout && "文件没有找到!/n";
cout && "/n文件列表:/n";
tempName = file.
if (tempName[0] == '.')
cout && file.
if (file.attrib == _A_NORMAL)
else if (file.attrib == _A_RDONLY)
else if (file.attrib == _A_HIDDEN)
else if (file.attrib == _A_SYSTEM)
else if (file.attrib == _A_SUBDIR)
} while (_findnext(longf, &file) == 0);//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1
_findclose(longf);
【剖析】对于_find一类的方法我还是第一次遇见(没见识...),但是这个方法真的特别有用,不仅可以对文件夹目录下的所有子文件夹进行寻找、遍历,并且还可以进行文件格式的遍历,对于读取训练或测试数据,直接后缀名写上“*.jpg”或者"*.png"等就可以把该文件夹下的所有图片都图进去了,这样就避免了图片名称无规律而读入困难的问题。
struct _finddata_t 是用来存储文件各种信息的结构体。
struct _finddata_t
time_t time_
time_t time_
time_t time_
char name[_MAX_FNAME];
time_create,time_access,time_write分别指创建时间,最近访问时间,和最后修改时间。name为文件(或文件夹)名称。attrib描述的文件的系统属性,它由多个attributes组合而成,在MSDN中描述如下:
Archive. Set whenever the file is changed, and cleared by the BACKUP command. Value: 0x20
Hidden file. Not normally seen with the DIR command, unless the /AH option is used. Returns information about normal files as well as files with this attribute. Value: 0x02
Normal. File can be read or written to without restriction. Value: 0x00
Read-only. File cannot be opened for writing, and a file with the same name cannot be created. Value: 0x01
Subdirectory. Value: 0x10
System file. Not normally seen with the DIR command, unless the /AS option is used. Value: 0x04
_A_SUBDIR属性表示该对象是一个子目录,我们可以探测这个位是否被设置来判断这是一个文件还是文件夹。这样,我们就可以采用递归的办法,来获取每个子目录下的文件信息。
参考博文:
http://blog.csdn.net/gengoo/article/details/4622084
用 _findfirst 和 _findnext 查找文件(转)
用 _findfirst 和 _findnext 查找文件
C++使用通配符查找文件(FindFirstFile)
使用_findfirst和_findnext遍历目录
C++ 中利用 _findfirst遍历所有文件夹及文件,以及findnext win10报错解决办法
_finddata_t和 _findfirst 和 _findnext 查找文件
解决Win10下_findnext()异常
&io.h& 用 _findfirst 和 _findnext 查找文件
没有更多推荐了,C++用 _findfirst 和 _findnext 查找文件
一、这两个函数均在io.h里面。
二、首先了解一下一个文件结构体:
struct _finddata_t {
name[260];
time_t,其实就是long
而_fsize_t,就是unsigned long
现在来解释一下结构体的数据成员吧。
attrib,就是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。
size:文件大小
name:文件名。
三、用 _findfirst 和 _findnext 查找文件
1、_findfirst函数:long _findfirst(const char , struct _finddata_t );
第一个参数为文件名,可以用”.“来查找所有文件,也可以用”*.cpp”来查找.cpp文件。第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。
2、_findnext函数:int _findnext(long, struct _finddata_t *);
第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1。
3、_findclose()函数:int _findclose(long);
只有一个参数,文件句柄。若关闭成功返回0,失败返回-1。
#include &io.h&
#include &iostream&
#include &fstream&
using namespace std;
bool transfer(string fileName, int exeNum );
void dfsFolder(string folderPath, ofstream &fout);
int main()
_finddata_
long HANDLE;
k = HANDLE = _findfirst("*.*", &file);
while (k != -1)
cout && file.name &&
k = _findnext(HANDLE, &file);
_findclose(HANDLE);
transfer("C:\\Windows\\*.exe", 0);
ofstream o_
dfsFolder("E:\\\WHU\\Study", o_fstream);
bool transfer(string fileName , int exeNum)
_finddata_t fileI
long handle = _findfirst(fileName.c_str(), &fileInfo);
if (handle == -1L)
cerr && "failed to transfer files" &&
return false;
cout && fileInfo.name &&
} while (_findnext(handle, &fileInfo) == 0);
cout && " .exe files' number:
" && exeNum &&
return true;
void dfsFolder(string folderPath, ofstream &fout)
_finddata_t FileI
string strfind = folderPath + "\\*";
long Handle = _findfirst(strfind.c_str(), &FileInfo);
if (Handle == -1L)
cerr && "can not match the folder path" &&
if (FileInfo.attrib & _A_SUBDIR)
if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
string newPath = folderPath + "\\" + FileInfo.
dfsFolder(newPath, fout);
fout&&folderPath.c_str() && "\\" && FileInfo.name && " ";
cout && folderPath.c_str() && "\\" && FileInfo.name &&
} while (_findnext(Handle, &FileInfo) == 0);
_findclose(Handle);
fout.close();
没有更多推荐了,_finddata_t
到底如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~
&&&&&&& 首先讲这个结构体吧~ struct _finddata_t ,这个结构体是用来存储文件各种信息的。说实话,这个结构体的具体定义代码,我没有找到,不过还好,文档里面在_find里有比较详细的成员变量介绍。我基本上就把文档翻译过来讲吧:
unsigned atrrib:&文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为 1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN
| _A_RDONLY | _A_SYSTEM 。
time_t time_create:&这里的time_t是一个变量类型(长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。
time_t time_access:&文件最后一次被访问的时间。
time_t time_write:&文件最后一次被修改的时间。
_fsize_t size:&文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。
char name&[_MAX_FNAME&]:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。
&&&&&&& 以此,我们可以推测出,struct _finddata_t,大概的定义如下:
&&&&&&& struct _finddata_t&
&&&&&&& {&
&&&&&&&&&&&&&
&&&&&&&&&&&& time_t time_&
&&&&&&&&&&&& time_t time_&
&&&&&&&&&&&& time_t time_&
&&&&&&&&&&&& _fsize_&
&&&&&&&&&&&& char name[_MAX_FNAME];&
&&&&&&& };
&&&&&&& 前面也说了,这个结构体是用来存储文件信息的,那么如何把一个硬盘文件的文件信息“存到”这个结构体所表示的内存空间里去呢?这就要靠_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函数结束查找。恩,对,这就是正确思路。下面我们就按照这样的思路来编写一个查找D:/Music文件夹下的所有 mp3的音乐。
#include&iostream&&&#include&io.h&&&using&namespace&&&&&const&char&*to_search=“D:\\Music\\*.mp3”;&&&&void&main()&&{&&&&&&long&&&&&&&struct&_finddata_t&&&&&&&handle=_findfirst(to_search,&fileinfo);&&&&&&if(-1==handle)&&&&&&&&&&return;&&&&&&printf(”%s\n”,fileinfo.name);&&&&&&while(!_findnext(handle,&fileinfo))&&&&&&{&&&&&&&&&&printf(”%s\n”,fileinfo.name);&&&&&&}&&&&&&_findclose(handle);&&}&&#include&iostream&
#include&io.h&
const char *to_search="D:\\Music\\*.mp3";
void main()
//用于查找句柄
struct _finddata_//文件信息的结构体
handle=_findfirst(to_search,&fileinfo);//第一次查找
if(-1==handle)
printf("%s\n",fileinfo.name);//打印出第一个文件名
while(!_findnext(handle,&fileinfo))
printf("%s\n",fileinfo.name);
_findclose(handle);//别忘了关闭句柄
哎呀,暴露了我喜欢的音乐了,还有好多呢,哈哈
下面是我自己添加的:
看到一段代码,也是提取文件夹里面的各个文件名的,这段代码可以提取子文件夹里面的文件名。比如我测试了一下,在F盘建立test文件夹,然后在该文件夹下建立了三个文件夹,1,2,3。 其中文件夹1里面是mp3文件,2里面是txt文件,3里面是docx文件
下面是代码:
#include&iostream&&&#include&vector&&&#include&&string&&&#include&&io.h&&&#include&&list&&&&&using&namespace&&&&&&&vector&string&&getFiles(const&string&&folder,const&bool&all&)&&&{&&&&&&vector&string&&&&&&&&list&string&&&&&&&&subfolders.push_back(folder);&&&&&&&&while&(!subfolders.empty())&{&&&&&&&&&&string&current_folder(subfolders.back());&&&&&&&&&&&&if&(*(current_folder.end()&-&1)&!=&‘/’)&{&&&&&&&&&&&&&&&&&&current_folder.append(”/*”);&&&&&&&&&&}&&&&&&&&&&else&{&&&&&&&&&&&&&&current_folder.append(”*”);&&&&&&&&&&}&&&&&&&&&&&&subfolders.pop_back();&&&&&&&&&&&&struct&_finddata_t&file_&&&&&&&&&&long&file_handler&=&_findfirst(current_folder.c_str(),&&file_info);&&&&&&&&&&&&while&(file_handler&!=&-1)&&&&&&&&&&&{&&&&&&&&&&&&&&if&(all&&&&&&&&&&&&&&&&&&&&&(!strcmp(file_info.name,&”.”)&||&!strcmp(file_info.name,&“..”)))&{&&&&&&&&&&&&&&&&&&if&(_findnext(file_handler,&&file_info)&!=&0)&break;&&&&&&&&&&&&&&&&&&continue;&&&&&&&&&&&&&&}&&#if&0&&&&&&&&&&&&&&斜杆/&和&反斜杠\&的区别基本上就是这些了,下面再讨论一下相对路径和绝对路径。&&&&&&&&&&&&&&&&&&./SRC/&&这样写表示,当前目录中的SRC文件夹;&&&&&&&&&&&&&&&&&&../SRC/&&这样写表示,当前目录的上一层目录中SRC文件夹;&&&&&&&&&&&&&&&&&&/SRC/&&&这样写表示,项目根目录(可以只磁盘根目录,也可以指项目根目录,具体根据实际情况而定)&&#endif&&&&&&&&&&&&&&&&if&(file_info.attrib&&&_A_SUBDIR)&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(all)&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&string&folder(current_folder);&&&&&&&&&&&&&&&&&&&&&&folder.pop_back();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&folder.append(file_info.name);&&&&&&&&&&&&&&&&&&&&&&&&subfolders.push_back(folder.c_str());&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&}&&&&&&&&&&&&&&else&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&string&file_&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&file_path.assign(current_folder.c_str()).pop_back();&&&&&&&&&&&&&&&&&&file_path.append(file_info.name);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&files.push_back(file_path);&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&if&(_findnext(file_handler,&&file_info)&!=&0)&break;&&&&&&&&&&}&&&&&&&&&&&&_findclose(file_handler);&&&&&&}&&&&&&&&return&&&}&&&&&&void&main()&&{&&&&&&string&path=”F:/test”;&&&&&&&&&&&&vector&string&&&&&&&&&&out=getFiles(path,true);&&&&&&&&for(int&i=0;i&out.size();i++)&&&&&&{&&&&&&&&&&cout&&out[i]&&&&&&&&}&&}&&#include&iostream&
#include&vector&
#include &string&
#include &io.h&
#include &list&
vector&string& getFiles(const string &folder,const bool all /* = true */)
vector&string&
list&string&
subfolders.push_back(folder);
while (!subfolders.empty()) {
string current_folder(subfolders.back());
if (*(current_folder.end() - 1) != '/') {
//确保地址是 “ ..../*” 结尾的
current_folder.append("/*");
current_folder.append("*");
subfolders.pop_back();
struct _finddata_t file_
long file_handler = _findfirst(current_folder.c_str(), &file_info);
while (file_handler != -1)
if (all &&
(!strcmp(file_info.name, ".") || !strcmp(file_info.name, ".."))) {
if (_findnext(file_handler, &file_info) != 0)
斜杆/ 和 反斜杠\ 的区别基本上就是这些了,下面再讨论一下相对路径和绝对路径。
这样写表示,当前目录中的SRC文件夹;
这样写表示,当前目录的上一层目录中SRC文件夹;
这样写表示,项目根目录(可以只磁盘根目录,也可以指项目根目录,具体根据实际情况而定)
if (file_info.attrib & _A_SUBDIR)
// it's a sub folder
// will search sub folder
string folder(current_folder);
folder.pop_back();
就是减去最后的*
string 的pop_back Delete last character
Erases the last character of the string, effectively reducing its length by one.
folder.append(file_info.name);
subfolders.push_back(folder.c_str());
// it's a file
string file_
// current_folder.pop_back();
file_path.assign(current_folder.c_str()).pop_back();
file_path.append(file_info.name);
files.push_back(file_path);
if (_findnext(file_handler, &file_info) != 0)
_findclose(file_handler);
void main()
string path="F:/test";
//注意这里地址是
vector&string&
out=getFiles(path,true);
for(int i=0;i&out.size();i++)
cout&&out[i]&&
}调试了半天,地址需要/&
代码中判断 . 和 ..的还不太明白,感觉是不会有的啊。
没有更多推荐了,文件查找&c语言 findfirst函数&findnext函数&
文件查找_finddata_t的使用
那么到底如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~ 首先讲这个结构体吧~ struct _finddata_t ,这个结构体是用来存储文件各种信息的。说实话,这个结构体的具体定义代码,我没有找到,不过还好,文档里面在_find里有比较详细的成员变量介绍。我基本上就把文档翻译过来讲吧:
文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。
文件属性是用位表示的,主要有以下一些:
_A_ARCH(存档)
A_HIDDEN(隐藏)
_A_NORMAL(正常)
_A_RDONLY(只读)
_A_SUBDIR(文件夹)
_A_SYSTEM(系统)
这些都是在中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
time_t time_create:
这里的time_t是一个变量类型(长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。
time_t time_access:
文件最后一次被访问的时间。
time_t time_write:
文件最后一次被修改的时间。
_fsize_t size:
文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。
char name[_MAX_FNAME]:
文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。
以此,我们可以推测出,struct _finddata_t ,大概的定义如下:
struct _finddata_t
time_t time_
time_t time_
time_t time_
char name[_MAX_FNAME];
前面也说了,这个结构体是用来存储文件信息的,那么如何把一个硬盘文件的文件信息“存到”这个结构体所表示的内存空间里去呢?这就要靠_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函数结束查找。恩,对,这就是正确思路。下面我们就按照这样的思路来编写一个查找C:\WINDOWS文件夹下的所有exe可执行文件的程序。
#include &stdio.h&
#include &direct.h&
#include &stdlib.h&
const char *to_search="C:\\WINDOWS\\*.exe"; //欲查找的文件,支持通配符
int main() {
//用于查找的句柄
struct _finddata_ //文件信息的结构体
handle=_findfirst(to_search,&fileinfo); //第一次查找
if(-1==handle)return -1; printf("%s\n",fileinfo.name); //打印出找到的文件的文件名
while(!_findnext(handle,&fileinfo)) //循环查找其他符合的文件,知道找不到其他的为止
printf("%s\n",fileinfo.name);
findclose(handle); //别忘了关闭句柄
system("pause");
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.037 (s). 12 q(s)

我要回帖

更多关于 结构体函数定义 的文章

 

随机推荐