ioh下的findfirst和finenext.docx

上传人:b****5 文档编号:11703722 上传时间:2023-03-30 格式:DOCX 页数:8 大小:16.86KB
下载 相关 举报
ioh下的findfirst和finenext.docx_第1页
第1页 / 共8页
ioh下的findfirst和finenext.docx_第2页
第2页 / 共8页
ioh下的findfirst和finenext.docx_第3页
第3页 / 共8页
ioh下的findfirst和finenext.docx_第4页
第4页 / 共8页
ioh下的findfirst和finenext.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

ioh下的findfirst和finenext.docx

《ioh下的findfirst和finenext.docx》由会员分享,可在线阅读,更多相关《ioh下的findfirst和finenext.docx(8页珍藏版)》请在冰豆网上搜索。

ioh下的findfirst和finenext.docx

ioh下的findfirst和finenext

io.h下的_findfirst()和_finenext()

一、这两个函数均在io.h里面。

二、首先了解一下一个文件结构体:

struct

_finddata_t{

unsigned

attrib;

time_t

time_create;

time_t

time_access;

time_t

time_write;

_fsize_t

size;

char

name[260];

};time_t,其实就是long

而_fsize_t,就是unsignedlong现在来解释一下结构体的数据成员吧。

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(constchar*,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

#include

 

using

namespacestd;int

main()

{

_finddata_tfile;

intk;

longHANDLE;

k=HANDLE=_findfirst("*.*",

&file);

while(k!

=-1)

{

cout

<<file.name

<<endl;

k=_findnext(HANDLE,

&file);

}

_findclose(HANDLE

);return0;

}转自:

_finddata_t

是用来存储文件各种信息的结构体。

定义如下:

struct_finddata_t

{

unsignedattrib;

time_ttime_create;

time_ttime_access;

time_ttime_write;

_fsize_tsize;

charname[_MAX_FNAME];

};

其中各成员变量的含义如下:

unsignedattrib:

文件属性的存储位置。

它存储一个unsigned单元,用于表示文件的属性。

文件属性是用位表示的,主要有以下一些:

_A_ARCH(存档)

_A_HIDDEN(隐藏)

_A_NORMAL(正常)

_A_RDONLY(只读)

_A_SUBDIR(文件夹)

_A_SYSTEM(系统)

这些都是在中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。

既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。

例如只读+隐藏+系统属性,应该为:

_A_HIDDEN

|_A_RDONLY|_A_SYSTEM。

time_ttime_create:

这里的time_t是一个变量类型(长整型?

相当于long

int?

),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。

time_ttime_access:

文件最后一次被访问的时间。

time_ttime_write:

文件最后一次被修改的时间。

_fsize_t

size:

文件的大小。

这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。

char

name[_MAX_FNAME]:

文件的文件名。

这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。

头文件引用:

#include"io.h"=========================================================[转]C++下遍历文件夹编写程序遍历文件夹及其子文件夹下所有文件,并输出到标准输出流或者文件流。

1.先考虑在单层目录下,遍历所有文件。

以C:

\WINDOWS为例:

用到数据结构_finddata_t,文件信息结构体的指针。

C++代码

struct_finddata_t

{

unsignedattrib;

//文件属性

time_ttime_create;

//文件创建时间

time_ttime_access;

//文件上一次访问时间

time_ttime_write;

//文件上一次修改时间

_fsize_tsize;

//文件字节数

charname[_MAX_FNAME];

//文件名

};文件属性是无符号整数,取值为相应的宏:

_A_ARCH(存档),_A_SUBDIR(文件夹),_A_HIDDEN(隐藏),_A_SYSTEM(系统),_A_NORMAL(正常),_A_RDONLY(只读)。

容易看出,通过这个结构体,我们可以得到关于该文件的很多信息。

结合以下函数,我们可以将文件信息存储到这个结构体中:

C++代码

//按FileName命名规则匹配当前目录第一个文件

_findfirst(_In_constchar*FileName,_Out_struct

_finddata64i32_t*_FindData);

//按FileName命名规则匹配当前目录下一个文件

_findnext(_In_intptr_t_FindHandle,_Out_struct

_finddata64i32_t*_FindData);

//关闭_findfirst返回的文件句柄

_findclose(_In_intptr_t_FindHandle);

_findfirst

函数返回的是匹配到文件的句柄,数据类型为long。

遍历过程可以指定文件类型,这通过FileName的赋值来实现,例如要遍历C:

\WINDOWS下的所有.exe文件

C++代码

booltransfer(stringfileName="C:

\\Windows\\*.exe",int

exeNum=0)

{

_finddata_tfileInfo;

longhandle=

_findfirst(fileName.c_str(),&fileInfo);

 

if(handle==-1L)

{

 

cerr<<"failedto

transferfiles"<<endl;

 

returnfalse;

}

 

do

{

 

exeNum++;

cout<<

fileInfo.name<

}while

(_findnext(handle,&fileInfo)==0);

cout

<<".exefiles'number:

"<<exeNum

<<endl;

returntrue;

}2.

遍历文件夹及其子文件夹下所有文件。

操作系统中文件夹目录是树状结构,使用深度搜索策略遍历所有文件。

用到_A_SUBDIR属性,可运行程序如下:

C++代码

voiddfsFolder(stringfolderPath,ofstream

&fout)

{

_finddata_tFileInfo;

stringstrfind=

folderPath+"\\*";

longHandle=

_findfirst(strfind.c_str(),&FileInfo);

 

if(Handle==-1L)

{

 

cerr<<"cannot

matchthefolderpath"<<endl;

 

exit(-1);

}

do{

 

//判断是否有子目录

if(FileInfo.attrib&_A_SUBDIR)

 

{

//这个语句很重要

 

if(

(strcmp(FileInfo.name,".")!

=0)

&&(strcmp(FileInfo.name,"..")!

=

0))

{

 

stringnewPath=folderPath+

"\\"+FileInfo.name;

 

dfsFolder(newPath,fout);

 

}

 

}

else

{

fout

<<folderPath

<<"\\"

<<FileInfo.name

<<"";

 

}

}while

(_findnext(Handle,&FileInfo)==0);

 

_findclose(Handle);

fout.close();

}在判断有无子目录的if分支中,由于系统在进入一个子目录时,匹配到的头两个文件(夹)是"."(当前目录),".."(上一层目录)。

需要忽略掉这两种情况。

当需要对遍历到的文件做处理时,在else分支中添加相应的代码就好

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1