C++编程使用findfirst和findnext查找及遍历文件实现示例
程序员文章站
2022-04-15 09:14:31
目录这两个函数均在io.h里面一、首先了解一下一个文件结构体:struct _finddata_t { unsigned attrib; time_t time_creat...
这两个函数均在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
,就是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_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:\\\whu\\study", 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<<folderpath.c_str() << "\\" << fileinfo.name << " "; cout << folderpath.c_str() << "\\" << fileinfo.name << endl; } } while (_findnext(handle, &fileinfo) == 0); _findclose(handle); fout.close(); } //#include <iostream> //#include <string> //#include <io.h> //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:\\whu\\study\\*.*", &file)) == -1l) // { // cout << "文件没有找到!\n"; // return 0; // } // do // { // cout << "文件列表:\n"; // tempname = file.name; // if (tempname[0] == '.') // continue; // cout << file.name<<endl; // // 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; //}
以上就是c++编程使用findfirst和findnext查找及遍历文件实现示例的详细内容,更多关于findfirst和findnext查找及遍历文件的资料请关注其它相关文章!