C/C++遍历文件夹和文件

本文详细介绍使用C/C++标准库函数遍历Windows和Linux平台的文件夹与文件方法。通过_finddata_t结构体和_findfirst、_findnext、_findclose函数,实现文件信息获取与遍历,提供代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C/C++遍历文件夹和文件

2015年02月05日 19:42:22 踏莎行hyx 阅读数:9153

版权声明:原创文章如需转载,请在左侧博主描述栏目扫码联系我并取得授权,谢谢 https://blog.youkuaiyun.com/u012234115/article/details/43533667

本方法可用于windows和linux双平台,采用C/C++标准库函数。

 

库函数

包含头文件 #include <io.h>

用到数据结构_finddata_t,文件信息结构体的指针。

 
  1. struct _finddata_t

  2. {

  3. unsigned attrib; //文件属性

  4. time_t time_create; //文件创建时间

  5. time_t time_access; //文件上一次访问时间

  6. time_t time_write; //文件上一次修改时间

  7. _fsize_t size; //文件字节数

  8. char name[_MAX_FNAME]; //文件名

  9. };

文件属性是无符号整数,取值为相应的宏:_A_ARCH(存档),_A_SUBDIR(文件夹),_A_HIDDEN(隐藏),_A_SYSTEM(系统),_A_NORMAL(正常),_A_RDONLY(只读)。容易看出,通过这个结构体,我们可以得到关于该文件的很多信息。结合以下函数,我们可以将文件信息存储到这个结构体中:

 
  1. //按FileName命名规则匹配当前目录第一个文件

  2. _findfirst(_In_ const char * FileName, _Out_ struct _finddata64i32_t * _FindData);

  3. //按FileName命名规则匹配当前目录下一个文件

  4. _findnext(_In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t * _FindData);

  5. //关闭_findfirst返回的文件句柄

  6. _findclose(_In_ intptr_t _FindHandle);


_findfirst 函数返回的是匹配到文件的句柄,数据类型为long。遍历过程可以指定文件类型。

 

实例

 
  1. #include <iostream>

  2. #include <string>

  3. #include <io.h>

  4. using namespace std;

  5.  
  6. //遍历当前目录下的文件夹和文件,默认是按字母顺序遍历

  7. bool TraverseFiles(string path,int &file_num)

  8. {

  9. _finddata_t file_info;

  10. string current_path=path+"/*.*"; //可以定义后面的后缀为*.exe,*.txt等来查找特定后缀的文件,*.*是通配符,匹配所有类型,路径连接符最好是左斜杠/,可跨平台

  11. //打开文件查找句柄

  12. int handle=_findfirst(current_path.c_str(),&file_info);

  13. //返回值为-1则查找失败

  14. if(-1==handle)

  15. return false;

  16. do

  17. {

  18. //判断是否子目录

  19. string attribute;

  20. if(file_info.attrib==_A_SUBDIR) //是目录

  21. attribute="dir";

  22. else

  23. attribute="file";

  24. //输出文件信息并计数,文件名(带后缀)、文件最后修改时间、文件字节数(文件夹显示0)、文件是否目录

  25. cout<<file_info.name<<' '<<file_info.time_write<<' '<<file_info.size<<' '<<attribute<<endl; //获得的最后修改时间是time_t格式的长整型,需要用其他方法转成正常时间显示

  26. file_num++;

  27.  
  28. }while(!_findnext(handle,&file_info)); //返回0则遍历完

  29. //关闭文件句柄

  30. _findclose(handle);

  31. return true;

  32. }

  33.  
  34. //深度优先递归遍历当前目录下文件夹和文件及子文件夹和文件

  35. void DfsFolder(string path,int layer)

  36. {

  37. _finddata_t file_info;

  38. string current_path=path+"/*.*"; //也可以用/*来匹配所有

  39. int handle=_findfirst(current_path.c_str(),&file_info);

  40. //返回值为-1则查找失败

  41. if(-1==handle)

  42. {

  43. cout<<"cannot match the path"<<endl;

  44. return;

  45. }

  46.  
  47. do

  48. {

  49. //判断是否子目录

  50. if(file_info.attrib==_A_SUBDIR)

  51. {

  52. //递归遍历子目录

  53. //打印记号反映出深度层次

  54. for(int i=0;i<layer;i++)

  55. cout<<"--";

  56. cout<<file_info.name<<endl;

  57. int layer_tmp=layer;

  58. if(strcmp(file_info.name,"..")!=0&&strcmp(file_info.name,".")!=0) //.是当前目录,..是上层目录,必须排除掉这两种情况

  59. DfsFolder(path+'/'+file_info.name,layer_tmp+1); //再windows下可以用\\转义分隔符,不推荐

  60. }

  61. else

  62. {

  63. //打印记号反映出深度层次

  64. for(int i=0;i<layer;i++)

  65. cout<<"--";

  66. cout<<file_info.name<<endl;

  67. }

  68. }while(!_findnext(handle,&file_info)); //返回0则遍历完

  69. //关闭文件句柄

  70. _findclose(handle);

  71. }

  72.  
  73. int main(int argc,char *argv[])

  74. {

  75. //遍历单个目录

  76. int file_num=0;

  77. if(!TraverseFiles("E:/android-ndk",file_num)) //此处路径连接符只能用/,根盘符大小写都行

  78. cout<<"traverse files failed"<<endl;

  79. cout<<"-------------------\n"<<"file number: "<<file_num<<endl;

  80.  
  81. //递归遍历文件夹

  82. DfsFolder("E:/personal_profile/tinyxml",0);

  83. return 0;

  84. }

(ps:貌似注释多了点,有点碍眼T_T)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值