您的位置:首页 > 编程语言 > C语言/C++

C/C++遍历文件和目录

2015-01-22 11:07 218 查看
C/C++遍历文件夹要用到_finddata_t结构体,函数_findfirst、_findnext和_fineclose,它们都定义在头文件<io.h>中,下面介绍具体如何使用。

 

结构体_finddata_t是用来存储文件各种信息的,其中成员变量分别为

Unsigned atrrib:文件属性的存储位置,它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐 藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是 在<io.h>中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其
他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该 为:_A_HIDDEN| _A_RDONLY |_A_SYSTEM 。

time_t time_create:存储文件创建的时间。

time_t time_access:存储文件最后一次被访问的时间。

time_t time_write:存储文件最后一次被修改的时间。

_fsize_t size:存储文件的大小。

char name[_MAX_FNAME]:存储文件的文件名。

 

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 <io.h>
#include <stdlib.h> //包含system()函数
#include <string>

using namespace std;

const char *to_search = "F:\\fna\\*.fna"; //欲查找的文件,支持通配符*

int main()
{
long handle; //用于查找的句柄
string str, filename;
_finddata_t fileinto; //文件信息的结构体
handle = _findfirst(to_search, &fileinto); //第一次查找文件
if(-1 == handle)
return -1;
cout << fileinto.name << endl; //输出查找到的文件名
str = fileinto.name;
str = "F:\\prodigal.exe -f sco -i F:\\fna\\" + str + " -o F:\\text.txt"; //命令行命令字符串
system(str.c_str()); //调用命令行命令

while(!_findnext(handle, &fileinto)) //循环查找其它的文件,直到找完文件为止
{
cout << fileinto.name << endl; //输出查找到的文件名
str = fileinto.name;
str = "F:\\prodigal.exe -f sco -i F:\\fna\\" + str + " -o F:\\text.txt";
system(str.c_str());
}
_findclose(handle); //关闭句柄
return 0;
}

另外一种遍历文件的方法,用windows.h头文件,供参考,下面是别人的源代码,

  #include<windows.h>
#include<iostream>
#include<string>
using namespace std;

//只能处理目录:lpPath只能是路径
void find(char *lpPath)
{
char szFind[MAX_PATH];
char szFile[MAX_PATH];

WIN32_FIND_DATA FindFileData;

strcpy(szFind,lpPath);
strcat(szFind,"//*.*");

HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
strcpy(szFile,lpPath);
strcat(szFile,"//");
strcat(szFile,FindFileData.cFileName);
find(szFile);
}
}
else
{
cout<<FindFileData.cFileName<<endl;
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}
//可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符
void _find(string path){
//取路径名最后一个"//"之前的部分,包括"//"
string prefix=path.substr(0,path.find_last_of('//')+1);

WIN32_FIND_DATA FindFileData;
HANDLE hFind=::FindFirstFile(path.c_str(), &FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
{
cout<<"文件通配符错误"<<endl;
return;
}
while(TRUE)
{
//目录
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//不是当前目录,也不是父目录
if(FindFileData.cFileName[0]!='.')
{
//查找下一级目录
_find(prefix+FindFileData.cFileName+"//"+"*.*");
}
}
//文件
else
{
cout<<FindFileData.cFileName<<endl;
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}

void main(){
//find("E:");//目录:E盘
//_find("E://*.*");//E盘下所有文件

string str="./test"; //这里指定的是目录

//string path;
//cout<<"请输入文件通配符:"<<flush;
//cin>>path;
// str=str+path;
find((char*)str.c_str());//可以处理".",".." 不可以处理"*","..//*"
//_find(str);//可以处理"*","..//*" 不可以处理".",".."
system("pause");
}
复制代码

其中有个结构体,它是C++自带的,是这样的:

typedef struct _WIN32_FIND_DATA{

   DWORD dwFileAttributes; // 文件属性
   FILETIME ftCreationTime; // 文件创建时间
   FILETIME ftLastAccessTime; // 文件最后一次访问时间
   FILETIME ftLastWriteTime; // 文件最后一次修改时间
   DWORD nFileSizeHigh; // 文件长度高 32 位
   DWORD nFileSizeLow; // 文件长度低 32 位
   DWORD dwReserved0; // 系统保留
   DWORD dwReserved1; // 系统保留
   TCHAR cFileName[ MAX_PATH ]; // 长文件名
   TCHAR cAlternateFileName[ 14 ]; // 文件的可选名

} WIN32_FIND_DATA;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: