//如果涉及到大文件的遍历(大于4GB),可以将以下代码_finddata_t换成__finddata64_t,_findfirst换成_findfirst64,_findnext换成_findnext64

void dfsFolder(CString dirPath)
{
 _finddata_t FileInfo;
 CString tmp=dirPath;
 if (tmp.Right(1) != "\\")
  tmp += "\\";
 CString strfind = tmp + "*";
 long Handle = _findfirst(strfind, &FileInfo);
 if (Handle == -1L)
 {
  //cerr << "can not match the folder path" << endl;
  return ;
 }
 do{
  //判断是否有子目录
  if (FileInfo.attrib&_A_SUBDIR)
  {
   // 由于系统在进入一个子目录时,匹配到的头两个文件(夹)
   // 是"."(当前目录),".."(上一层目录)。需要忽略掉这两种情况
   if( (strcmp(FileInfo.name,".") != 0 ) &&(strcmp(FileInfo.name,"..") != 0))  
   {
    //判断是否处理隐藏文件夹、系统文件夹
    //if ((!(FileInfo.attrib&_A_HIDDEN)||PROC_HIDDEN)&&
    // (!(FileInfo.attrib&_A_SYSTEM)||PROC_SYSTEM))
    {
     CString newPath = dirPath + "\\" + FileInfo.name;
     //递归遍历更深层次的文件夹
     dfsFolder(newPath);
    }
   }
  }
  else 
  {

CString fileSizeStr;
    //文件大小
    if (FileInfo.size/1024.0<1)
    {
     fileSizeStr.Format("%I64dB",FileInfo.size);
    }
    else if (FileInfo.size/(1024.0*1024.0)<1)
    {
     fileSizeStr.Format("%.2I64fKB",FileInfo.size/1024.0);
    }

  //最后修改文件的时间
    CTime time(FileInfo.time_write);
    CString timeStr = time.Format( "%Y/%m/%d %H:%M:%S" );
   // 文件名字(包括后缀名)
   CString nameExt(FileInfo.name);
   int i=nameExt.ReverseFind('.');
   CString name=nameExt.Left(i);
   CString ext=nameExt.Mid(i+1);
  }
 }while (_findnext(Handle, &FileInfo) == 0);
 _findclose(Handle);
}

---------------------------------------------------------------------------------

//以下代码可以复制带有子文件夹的文件夹

void dfsCopyFolder(CString srcPath, CString dstPath)
{
 _finddata_t FileInfo;
 CString tmp=srcPath;
 if (tmp.Right(1) != "\\")
  tmp += "\\";
 CString strfind = tmp + "*";
 long Handle = _findfirst(strfind, &FileInfo);
 if (Handle == -1L)
 {
  //cerr << "can not match the folder path" << endl;
  return ;
 }
 do{
  //判断是否有子目录
  if (FileInfo.attrib&_A_SUBDIR)
  {
   // 由于系统在进入一个子目录时,匹配到的头两个文件(夹)
   // 是"."(当前目录),".."(上一层目录)。需要忽略掉这两种情况
   if( (strcmp(FileInfo.name,".") != 0 ) &&(strcmp(FileInfo.name,"..") != 0))  
   {
    //判断是否处理隐藏文件夹、系统文件夹
    //if ((!(FileInfo.attrib&_A_HIDDEN)||PROC_HIDDEN)&&
    // (!(FileInfo.attrib&_A_SYSTEM)||PROC_SYSTEM))
    {
     CString newSrcPath = srcPath + "\\" + FileInfo.name;
     CString newDstPath = dstPath + "\\" + FileInfo.name;
     if (!PathFileExists(newDstPath))//判断是否存在重名文件
     {
      //生成目标文件夹
      if(!CreateDirectory(newDstPath,NULL))  
      {
       //AfxMessageBox("创建文件夹失败!");
      }
     }
     //递归遍历更深层次的文件夹
     dfsCopyFolder(newSrcPath, newDstPath);
    }
   }
  }
  else 
  {
   // 文件名字(包括后缀名)
   CString nameExt(FileInfo.name);
   int i=nameExt.ReverseFind('.');
   CString name=nameExt.Left(i);
   CString ext=nameExt.Mid(i+1);
   CString srcFile=srcPath+"\\"+nameExt;
   CString dstFile=dstPath+"\\"+nameExt;
   BOOL b=CopyFile(srcFile, dstFile, false);//强行覆盖
   if (!b)
   {
    //AfxMessageBox("复制"+srcFile+"文件失败!");
   }

}
 }while (_findnext(Handle, &FileInfo) == 0);
 _findclose(Handle);
}

MFC dfs遍历文件的更多相关文章

  1. DFS遍历拷贝所有子文件夹及目录列表 (Java版)

    如题 注意,文件夹是不能拷贝的, 需要mkdir的 文件选择合适的流进行拷贝 main测试方法 /** * 主测试类,默认将D:\\base01 下的复制到D:\\base02 * @param ar ...

  2. MFC拖拽、选择目录、遍历文件

    1.选择目录 void CDecryptFileDlg::OnBnClickedSel() { std::wstring selectedDir; WCHAR szDir[MAX_PATH]; Zer ...

  3. 图之BFS和DFS遍历的实现并解决一次旅游中发现的问题

    这篇文章用来复习使用BFS(Breadth First Search)和DFS(Depth First Search) 并解决一个在旅游时遇到的问题. 关于图的邻接表存储与邻接矩阵的存储,各有优缺点. ...

  4. MFC 与Excel文件的交互操作

    假日快要结束了.带着沉重的心情写下之前关于MFC与Excel文件交互的总结. 因为VS的版本号不同可能在操作上有些差异.所以在此指明下本篇文章的project环境为VS2013,也建议大家用最新的. ...

  5. ORACEL上传BLOB,深度遍历文件夹

    // uploadingDlg.cpp : 实现文件// #include "stdafx.h"#include "uploading.h"#include & ...

  6. C#遍历文件夹下所有文件

    FolderForm.cs的代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using ...

  7. windowsAPI遍历文件夹(速度高于递归)

    #region API 遍历文件夹及其子文件夹和子文件 #region 声明WIN32API函数以及结构 ************************************** [DllImpo ...

  8. C# 遍历文件夹下所有子文件夹中的文件,得到文件名

    假设a文件夹在F盘下,代码如下.将文件名输出到一个ListBox中using System.Data;using System.Drawing;using System.Linq;using Syst ...

  9. python 遍历文件夹 文件

    python 遍历文件夹 文件   import os import os.path rootdir = "d:\data" # 指明被遍历的文件夹 for parent,dirn ...

随机推荐

  1. SqlParameter中的size

    SqlParameter中size对于需要指定大小的数据库中的数据类型参数有影响[如nvarchar],如果对于这些类型没有指定size则会默认根据赋的值进行推导应该指定的size,而对于那些大小固定 ...

  2. 洛谷P1656 炸铁路

    题目描述 因为某国被某红色政权残酷的高压暴力统治.美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵. 该国有n个城市,这些城市以铁路相连.任意两个城市都可以通过铁路直接或者间接到达. uim ...

  3. android 自定义控件 使用declare-styleable进行配置属性(源码角度)

          android自定义styleableattrs源码 最近在模仿今日头条,发现它的很多属性都是通过自定义控件并设定相关的配置属性进行配置,于是便查询了解了下declare-styleabl ...

  4. IOS基础之(十四) KVO/KVC

    资料参考: http://www.cnblogs.com/kenshincui/p/3871178.html http://www.cnblogs.com/stoic/archive/2012/07/ ...

  5. MS-sqlserver数据库2008如何转换成2000

    http://bbs.csdn.net/topics/390438560?page=1#post-394316973 MS-sqlserver数据库2008如何转换成2000 回你这个贴等于我写个博客 ...

  6. 嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

    /*************************************************************************************************** ...

  7. jquery------脚注的使用

    index.jsp <script type="text/javascript" src="../js/my.js"></script> ...

  8. ALTER 语句修改数据表

    1.修改数据表名:alter table 表名 rename 新表名; 2.修改列名: alter table 表名 change 列名 新列名(可以与旧的一样) 类型 默认值; 3.修改类型: al ...

  9. linux 的终端字体色和背景色的修改方法(一)

    更改Linux系统终端的颜色主题 随着Linux系统在服务器端的崛起,Linux也在慢慢进军个人桌面系统领域.如果在使用Linux系统的终端时,对其颜色主题不是很满意,该怎么修改颜色的主题呢?今天笔者 ...

  10. 编译安装apache下添加mod_rewrite支持

    今天我依旧在学习我的编程语言,接到同事的一个请求.说在25*服务器上添加一个apache的mod_rewrite的模块支持 感觉还好了,这个很简单,所有就开始做了.不过这个服务器已经相当久远了,一下吧 ...