C++编程使用findfirst和findnext查找及遍历文件实现示例
#include
#include
#include
using namespace std;
bool transfer(string fileName, int exeNum );
void dfsFolder(string folderPath, ofstream &fout);
int main()
{
_finddata_t file;
int k;
long HANDLE;
k = HANDLE = _findfirst("*.*", &file);
while (k != -1)
{
cout << file.name << endl;
k = _findnext(HANDLE, &file);
}
_findclose(HANDLE);
transfer("C:Windows*.exe", 0);
ofstream o_fstream;
dfsFolder("E:WHUStudy", o_fstream);
return 0;
}
//_findfirst 函数返回的是匹配到文件的句柄,数据类型为long。
//遍历过程可以指定文件类型,这通过FileName的赋值来实现,例如要遍历C : WINDOWS下的所有.exe文件
bool transfer(string fileName , int exeNum)
{
_finddata_t fileInfo;
long handle = _findfirst(fileName.c_str(), &fileInfo);
if (handle == -1L)
{
cerr << "failed to transfer files" << endl;
return false;
}
do
{
exeNum++;
cout << fileInfo.name << endl;
} while (_findnext(handle, &fileInfo) == 0);
cout << " .exe files' number: " << exeNum << endl;
return true;
}
//遍历文件夹及其子文件夹下所有文件。操作系统中文件夹目录是树状结构,使用深度搜索策略遍历所有文件。用到_A_SUBDIR属性
//在判断有无子目录的if分支中,由于系统在进入一个子目录时,匹配到的头两个文件(夹)是"."(当前目录),".."(上一层目录)。
//需要忽略掉这两种情况。当需要对遍历到的文件做处理时,在else分支中添加相应的代码就好
void dfsFolder(string folderPath, ofstream &fout)
{
_finddata_t FileInfo;
string strfind = folderPath + "*";
long Handle = _findfirst(strfind.c_str(), &FileInfo);
if (Handle == -1L)
{
cerr << "can not match the folder path" << endl;
exit(-1);
}
do{
//判断是否有子目录
if (FileInfo.attrib & _A_SUBDIR)
{
//这个语句很重要
if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
{
string newPath = folderPath + "" + FileInfo.name;
dfsFolder(newPath, fout);
}
}
else
{
fout< cout << folderPath.c_str() << "" << FileInfo.name << endl; } } while (_findnext(Handle, &FileInfo) == 0); _findclose(Handle); fout.close(); } //#include //#include //#include //using namespace std; // //int main() //{ // _finddata_t file; // long longf; // string tempName; // //_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *) // if ((longf = _findfirst("E:WHUStudy*.*", &file)) == -1l) // { // cout << "文件没有找到! "; // return 0; // } // do // { // cout << "文件列表: "; // tempName = file.name; // if (tempName[0] == '.') // continue; // cout << file.name< // // if (file.attrib == _A_NORMAL) // { // cout << " 普通文件 "; // } // else if (file.attrib == _A_RDONLY) // { // cout << " 只读文件 "; // } // else if (file.attrib == _A_HIDDEN) // { // cout << " 隐藏文件 "; // } // else if (file.attrib == _A_SYSTEM) // { // cout << " 系统文件 "; // } // else if (file.attrib == _A_SUBDIR) // { // cout << " 子目录 "; // } // else // { // cout << " 存档文件 "; // } // cout << endl; // } while (_findnext(longf, &file) == 0);//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1 // // _findclose(longf); // // return 0; //}