zoukankan      html  css  js  c++  java
  • MFC dfs遍历文件

    //如果涉及到大文件的遍历(大于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);
    }

  • 相关阅读:
    数学之美 系列十一 Google 阿卡 47 的制造者阿米特.辛格博士
    IE6 中的最大最小寬度和高度 css 高度 控制(兼容版本)
    数学之美 系列一 统计语言模型
    数学之美 系列八 贾里尼克的故事和现代语言处理
    数学之美 系列二 谈谈中文分词
    数学之美系列 4 怎样度量信息?
    带线的无限级下拉树列表完整示例篇
    实战篇通用的页面列表导出Excel控件
    CYQ.Data 轻量数据层之路 V3.0版本发布Xml绝对杀手(三十二)
    秋色园Blog 博客系列索引
  • 原文地址:https://www.cnblogs.com/coolbear/p/3458118.html
Copyright © 2011-2022 走看看