C/C++遍历文件和目录
2015-01-22 11:07
253 查看
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;
结构体_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;
相关文章推荐
- paip.c++ qt 目录遍历以及文件操作
- paip.c++ qt 目录遍历以及文件操作
- c++遍历创建文件目录
- Win32下C++遍历目录和文件的源码
- x64下vs2013 C++遍历目录下所有文件使用_findnext()调试时中断
- Win32下C++遍历目录和文件的源码
- x64下vs2013 C++遍历目录下所有文件使用_findnext()调试时中断
- 通过C/C++遍历目录下的所有文件
- c++ 遍历目录下文件和文件夹
- Win32下C++遍历目录和文件的源码
- c++遍历目录下文件
- c++遍历目录文件
- C++ 遍历目录所有文件并判断是否为目录
- c++ 遍历目录查找文件
- C++ 遍历目录下文件
- C++ 遍历目录下的所有文件
- C++遍历文件夹及判断某一文件或目录是否存在
- Linux下 C++遍历目录下所有文件
- C++遍历目录,并把目录里超过7天的文件删除(跨平台windows&linux)
- Win32下C++遍历目录和文件的源码