内容简介:遍历文件夹和文件,本方法可用于windows和linux双平台,采用C/C++标准库函数。
本方法可用于windows和 linux 双平台,采用C/C++标准库函数。
库函数
包含头文件 #include
用到数据结构_finddata_t,文件信息结构体的指针。
1 2 3 4 5 6 7 8 9 |
struct _finddata_t { unsigned attrib; //文件属性 time_t time_create; //文件创建时间 time_t time_access; //文件上一次访问时间 time_t time_write; //文件上一次修改时间 _fsize_t size; //文件字节数 char name[_MAX_FNAME]; //文件名 }; |
文件属性是无符号整数,取值为相应的宏:_A_ARCH(存档),_A_SUBDIR(文件夹),_A_HIDDEN(隐藏),_A_SYSTEM(系统),_A_NORMAL(正常),_A_RDONLY(只读)。容易看出,通过这个结构体,我们可以得到关于该文件的很多信息。结合以下函数,我们可以将文件信息存储到这个结构体中:
1 2 3 4 5 6 |
//按FileName命名规则匹配当前目录第一个文件 _findfirst(_In_ const char * 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。遍历过程可以指定文件类型。
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#include <iostream> #include <string> #include <io.h> using namespace std; //遍历当前目录下的文件夹和文件,默认是按字母顺序遍历 bool TraverseFiles(string path,int &file_num) { _finddata_t file_info; string current_path=path+"/*.*"; //可以定义后面的后缀为*.exe,*.txt等来查找特定后缀的文件,*.*是通配符,匹配所有类型,路径连接符最好是左斜杠/,可跨平台 //打开文件查找句柄 int handle=_findfirst(current_path.c_str(),&file_info); //返回值为-1则查找失败 if(-1==handle) return false; do { //判断是否子目录 string attribute; if(file_info.attrib==_A_SUBDIR) //是目录 attribute="dir"; else attribute="file"; //输出文件信息并计数,文件名(带后缀)、文件最后修改时间、文件字节数(文件夹显示0)、文件是否目录 cout<<file_info.name<<' '<<file_info.time_write<<' '<<file_info.size<<' '<<attribute<<endl; //获得的最后修改时间是time_t格式的长整型,需要用其他方法转成正常时间显示 file_num++; }while(!_findnext(handle,&file_info)); //返回0则遍历完 //关闭文件句柄 _findclose(handle); return true; } //深度优先递归遍历当前目录下文件夹和文件及子文件夹和文件 void DfsFolder(string path,int layer) { _finddata_t file_info; string current_path=path+"/*.*"; //也可以用/*来匹配所有 int handle=_findfirst(current_path.c_str(),&file_info); //返回值为-1则查找失败 if(-1==handle) { cout<<"cannot match the path"<<endl; return; } do { //判断是否子目录 if(file_info.attrib==_A_SUBDIR) { //递归遍历子目录 //打印记号反映出深度层次 for(int i=0;i<layer;i++) cout<<"--"; cout<<file_info.name<<endl; int layer_tmp=layer; if(strcmp(file_info.name,"..")!=0&&strcmp(file_info.name,".")!=0) //.是当前目录,..是上层目录,必须排除掉这两种情况 DfsFolder(path+'/'+file_info.name,layer_tmp+1); //再windows下可以用\\转义分隔符,不推荐 } else { //打印记号反映出深度层次 for(int i=0;i<layer;i++) cout<<"--"; cout<<file_info.name<<endl; } }while(!_findnext(handle,&file_info)); //返回0则遍历完 //关闭文件句柄 _findclose(handle); } int main(int argc,char *argv[]) { //遍历单个目录 int file_num=0; if(!TraverseFiles("E:/android-ndk",file_num)) //此处路径连接符只能用/,根盘符大小写都行 cout<<"traverse files failed"<<endl; cout<<"-------------------\n"<<"file number: "<<file_num<<endl; //递归遍历文件夹 DfsFolder("E:/personal_profile/tinyxml",0); return 0; } |
(ps:貌似注释多了点,有点碍眼T_T)
原文出处: 踏莎行hyx
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- PHP超低内存遍历目录文件和读取超大文件
- PowerShell~文件操作和对象遍历
- Python遍历某目录下的所有文件夹与文件路径
- 数组常见的遍历循环方法、数组的循环遍历的效率对比
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
- Js遍历数组总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Building Websites with Joomla!
H Graf / Packt Publishing / 2006-01-20 / USD 44.99
This book is a fast paced tutorial to creating a website using Joomla!. If you've never used Joomla!, or even any web content management system before, then this book will walk you through each step i......一起来看看 《Building Websites with Joomla!》 这本书的介绍吧!