c++ 遍历文件夹(转)

  1. /* 文件名:searchAllFile.cpp
  2. * int searchAllFile(string filePath, //要搜索的文件路径
  3. * int layer //layer==0 //搜索的层次,输入路径的层次应该为0
  4. * string fileNameToSave); //存储文件信息的文件名,包括路径
  5. *
  6. *
  7. *
  8. *
  9. *
  10. *
  11. * <io.h>中定义了结构体 struct _finddata64i32_t (C风格),用来存储文件的各种信息
  12. *详细如下:
  13. *struct _finddata64i32_t
  14. * {
  15. * unsigned attrib;
  16. * __time64_t time_create; // -1 for FAT file systems
  17. * __time64_t time_access; // -1 for FAT file systems
  18. * __time64_t time_write;
  19. * _fsize_t size;
  20. * char name[260];
  21. * };
  22. *各参数意义如下:
  23. *unsigned attrib :4个字节,存储文件的属性
  24. * _A_ARCH (存档) 0x20
  25. * _A_SUBDIR(文件夹)0x10
  26. * _A_SYSTEM(系统)0x04
  27. * _A_HIDDEN(隐藏)0x02
  28. * _A_RDONLY(只读)0x01
  29. * _A_NORMAL(正常)0X00
  30. *这些都是<io.h>中定义的宏,每一个都是一个unsigned int,各属性叠加时进行或运算,如_A_HIDDEN|_A_RDONLY
  31. *
  32. *__time64_t time_create: 文件创建的时间
  33. *__time64_t time_access: 文件最后一次访问的时间
  34. *__time64_t time_write: 文件最后以此修改的时间
  35. *_fsize_t size: 文件的大小,字节为单位
  36. *char name[260]: 文件名
  37. *
  38. *--------------------------------------------------------------------------------------------------------------------------------
  39. *<io.h> 中定义了两个函数
  40. *long _findfirst64i32(const char * _Filename,struct _finddata64i32_t * _FindData); ,查找第一个_Filename的信息,存储到结构体_FindData中             
  41. * 查找成功,返回一个用于继续查找的句柄(一个唯一的编号)
  42. * 查找 失败,返回-1
  43. *int _findnext64i32(long handle,struct _finddata64i32_t *fileinfo) ; 根据句柄handle查找下一个文件,存放在 fileinfo中
  44. * 查找成功,返回0,失败返回-1
  45. *ing _findclose(long handle); 关闭句柄handle,成功返回0,失败返回-1
  46. *---------------------------------------------------------------------------------------------------------------------------------------
  47. */
  48. #include<iostream>
  49. #include<string>
  50. #include<fstream>
  51. #include<io.h> //定义了结构体struct _finddata64i32_t(该结构体包含文件的相关属性,如文件名,文件的属性等
  52. //定义函数: long _findfirst64i32(char* fileName,struct _finddata64i32_t *fileinf0);
  53. //定义函数: int _findnext64i32(long handle,struct _finddata64i32_t *fileinfo);
  54. //定义函数: int _findclose(long handle);
  55. using namespace std;
  56. //定义链表结点
  57. struct fileInfoNode
  58. {
  59. struct _finddata64i32_t fileInfo; //保存文件信息的结构体
  60. string fileName;
  61. struct fileInfoNode* left;
  62. };
  63. //把文件信息连接到链表head中
  64. int saveToLink(struct fileInfoNode*& head, //链表的头结点,引用参量
  65. const string& fileName, //IN:文件名(包括路径)
  66. const struct _finddata64i32_t& fileInfo) //IN:文件信息结构体,引用参量
  67. {
  68. //建立一个结点
  69. fileInfoNode* p;
  70. p=new fileInfoNode;
  71. p->fileInfo=fileInfo; //把传入的文件信息复制进结点
  72. p->fileName=fileName;
  73. p->left=head;
  74. head=p;
  75. return 0;
  76. }
  77. //显示整个查找到的文件的信息
  78. void displayLink(struct fileInfoNode* head)//IN:头结点,值传递参数
  79. {
  80. while(head!=NULL)
  81. {
  82. cout<<"fileName: "<<head->fileName<<endl;
  83. cout<<"fileSize: "<<dec<<head->fileInfo.size<<"字节"<<endl;
  84. cout<<"fileAttrib: "<<"0x"<<hex<<head->fileInfo.attrib<<endl;
  85. cout<<"-------------------------------------------------------------------------------------------"<<endl;
  86. head=head->left;
  87. }
  88. }
  89. //把文件信息存储到文件 fileName 中
  90. void saveLinkToFile(struct fileInfoNode* head,string saveFileName,int counter)
  91. {
  92. ofstream fout;
  93. //打开文件
  94. fout.open(saveFileName.c_str());
  95. if((fout.is_open())==false)
  96. {
  97. cout<<"存储文件打开失败!"<<endl;
  98. exit(-1);
  99. }
  100. fout<<"the file number is: "<<counter<<endl;
  101. fout<<"-------------------------------------------------------------------------------------------------------"<<endl;
  102. while(head!=NULL)
  103. {
  104. fout<<"fileName: "<<head->fileName<<endl;
  105. fout<<"fileSize: "<<dec<<head->fileInfo.size<<"字节"<<endl;
  106. fout<<"fileAttrib: "<<"0x"<<hex<<head->fileInfo.attrib<<endl;
  107. fout<<"-------------------------------------------------------------------------------------------------------"<<endl;
  108. head=head->left;
  109. }
  110. //关闭文件
  111. fout.close();
  112. }
  113. //
  114. int searchAllFile(string filePath,//IN:文件所在的路径,如:f:\example
  115. int layer,//层次,只有层次为0时,才完成链表中文件信息的显示和存储
  116. string fileInfoOut) //IN:存储的文件名
  117. {
  118. struct _finddata64i32_t fileInfo;//保存文件信息的结构体
  119. static fileInfoNode* head=NULL; //fileInfoNode链表的头结点,静态存储
  120. static int counter=0; //记录文件数目
  121. long handle;//句柄
  122. int done;//查找nextfile是否成功
  123. string fileName=filePath+"\\*.*"; //要搜索的文件名
  124. //查找第一个文件,返回句柄
  125. handle=_findfirst64i32(fileName.c_str(),&fileInfo);
  126. if(handle==-1)
  127. {
  128. cout<<"该目录为空!"<<endl;
  129. //cin.get();
  130. return -1;
  131. }
  132. do
  133. {
  134. // cout<<"查找成功"<<endl;
  135. // cin.get();
  136. // cout<<fileInfo.name<<endl;
  137. //如果是文件夹".",或者"..",则进行判断下一个文件
  138. if((strcmp(fileInfo.name,".")==0)|(strcmp(fileInfo.name,"..")==0))
  139. {
  140. //cout<<"丢弃!"<<endl;
  141. //cin.get();
  142. continue;
  143. }
  144. //如果是文件夹,则进入下一层文件夹搜索
  145. if((fileInfo.attrib&_A_SUBDIR)==_A_SUBDIR)
  146. {
  147. // cout<<"是文件夹"<<endl;
  148. // cin.get();
  149. string filePathSub=filePath+"\\"+fileInfo.name;
  150. //递归调用
  151. searchAllFile(filePathSub,++layer,fileInfoOut);
  152. layer--;
  153. }
  154. //把搜集到的信息连接到文件
  155. else
  156. {
  157. // cout<<"是文件,存储信息!"<<endl;
  158. // cin.get();
  159. counter++;
  160. string fileNameTure=filePath+"\\"+fileInfo.name;
  161. saveToLink(head,fileNameTure,fileInfo); //存储到链表中
  162. }
  163. }while(!(done=_findnext64i32(handle,&fileInfo)));
  164. _findclose(handle);
  165. //layer==时,完成链表的存储
  166. if(layer==0)
  167. {
  168. //显示链表中的内容
  169. displayLink(head);
  170. //存储链表中的内容
  171. saveLinkToFile(head,fileInfoOut,counter);
  172. }
  173. return 0;
  174. }
时间: 10-02

c++ 遍历文件夹(转)的相关文章

OpenCV实现遍历文件夹下所有文件

OpenCV中有实现遍历文件夹下所有文件的类Directory,它里面包括3个成员函数:(1).GetListFiles:遍历指定文件夹下的所有文件,不包括指定文件夹内的文件夹:(2).GetListFolders:遍历指定文件夹下的所有文件夹,不包括指定文件夹下的文件:(3).GetListFilesR:遍历指定文件夹下的所有文件,包括指定文件夹内的文件夹. 若要使用Directory类,则需包含contrib.hpp头文件,此类的实现在contrib模块. 下面为测试代码: cv::Dire

递归的一些应用(一)遍历文件夹

函数的递归调用 递归的含义 递归其实也只是一种算法上的描述,不是一种新的语法! 有时候,我们解决问题的时候,会遇到这种情况,当我们把一个大的问题按照某种解决方案分成若干个小的问题的时候,发现这些小问题的解决方案其实和刚才大问题的解决方案又是一样的! 典型的,比如:求阶乘! 10! = 10 * 9! 9! =  9 * 8! 8! = 8 * 7! …… 语法上,函数的递归调用,就是函数在执行的过程中自己又调用自己! 递归的两个要点: 1,  递归的出口:就是指什么时候停止递归调用 2,  递归

Android开发手记(21) 遍历文件夹

我们在遍历文件夹的时候由于涉及到SD卡相关操作,所以我们需要添加如下权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 首先,需要检查SD卡挂载状态: boolean sdCard

Java遍历文件夹下所有文件并替换指定字符串

应用场景:比如有一个深层次的文件目录结构,如:javaAPI 每个文件里面都有相同的内容,而我们要统一修改为其他内容.上千个文件如果一个个修改显得太不明智. import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.PrintWriter; public class Test { /** *

Linux下的C程序,遍历文件夹并统计其中各个类型文件所占百分比

递归遍历一个目录下的所有文件和文件夹,统计各个类型文件所占的百分比 程序代码a.cpp(编译命令:g++ a.cpp -o a) #include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <dirent.h> #include <string.h> stru

php高效遍历文件夹、高效读取文件

/** * PHP高效遍历文件夹 * @param string $path 目录路径 * @param integer $level 目录深度 */ function fn_scandir($path = './', $level = 0) { $file = new FilesystemIterator($path); $filename = ''; $prefix = ''; $url = ''; foreach ($file as $fileinfo) { $filename = $fi

nodejs:遍历文件夹文件统计文件大小

根据 http://blog.csdn.net/hero82748274/article/details/45700465这里的思路对读写文件做了一个 封装: webpack在打包的时候可以借助assets-webpack-plugin插件形成全部打包文件的json map,不过因为项目需要这个生成的json不能满足我的需要,我们目前需要生成形式为以下的json文件: {"jsFile":{ "mainSite":"mainSite.js", &

PHP封装一个遍历文件夹下面得所有的文件

//遍历文件夹下面所有的文件 function my_scandir($dir) { $files = array(); if ($handle = opendir($dir)){ while (($files = readdir($handle)) !== false){ if ($files != "." && $files != "."){ $files[$files] = my_scandir($dir . "/" . $

C#遍历文件夹(包括子目录)下的所有文件

前提现在一个分区下建立bb.txt文件. 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.IO; 10 11 name

Java遍历文件夹下的所以文件

利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重命名操作 1 package com.zhang.test; 2 3 import java.io.File; 4 5 public class getfilepath { 6 7 public static void main(String[] args) { 8 getDirectory(new