zoukankan      html  css  js  c++  java
  • windows下的文件遍历(使用CFindFile)

    windows下的文件遍历(使用CFindFile)

     

    这个我一直都很想做了,前两天开始准备,查找了一下CFindFile的资料,然后把思路理清楚,就直接开始做了。

    文件系统是一个操作系统以一部分,所以想文件操作,基本上就要依赖于操作系统提供的接口函数。

    在这我是直接用windows中对文件查找专门做好了的一个类来实现文件的遍历。

    其实一个文件目录就是一个树,每一层目录都有很多的子目录和文件,当成节点就好了。

    在使用CFindFile遍历的时候,需要先调用FindFile函数,再调用FindNextFile函数来遍历当前这一级的目录。

    我为了输出方便使用了控制台工程,在这里需要提示一点:

    由于windows程序设计中默认使用unicode编码,所以在使用控制台程序输出的时候,需要使用wcout来进行输出。

    而使用wcout进行输出的时候,如果遇到了汉字,则会导致程序卡住,然后停止运行的情况。

    解决方法是添加下面的函数调用:

    setlocale(LC_ALL, "chs");

    这个函数是我在网上查到的,我遇到这个问题就是因为在遍历C盘目录的时候由于汉字的出现卡死,发现一个文件名只输出了前面的数字和英文部分,而汉字没输出。

    先展示下我做的成果:

    最后运行结束:

    效果还可以吧?所有的目录应该都列出来了。

    下面看一下函数:

    复制代码
     1 void TraversFile(CString csPath)
     2 {
     3     CString csPrePath = csPath;
     4     CString csNextPath = csPath;
     5     CFileFind ff;
     6     csPath += _T("*.*");//遍历这一级全部的目录
     7     int nResult = ff.FindFile(csPath);
     8     while(nResult)
     9     {
    10         nResult = ff.FindNextFileW();
    11         if(ff.IsDirectory() && !ff.IsDots())
    12         {
    13             wcout << (LPCTSTR)ff.GetFilePath() << endl;
    14             csNextPath += ff.GetFileName();
    15             csNextPath += _T("\");
    16             TraversFile(csNextPath);
    17         }
    18         csNextPath = csPrePath;
    19     }
    20 }
    复制代码

    这里主要采用的方法是递归调用,我觉得这种方式相对较简单,且代码段比较少可以看到,这个函数一共才20行,而且层次很清晰。 

    我觉得主要需要讲的就是那个if判断,因为在那块是需要注意的两个地方。

    IsDirectory函数用来判断当前选中的这个文件是一个文件还是一个目录。所谓目录,其实就是文件夹啦~

    如果是文件夹的话,就输出路径,然后整合文件夹的路径,传给递归调用函数,来遍历当前这个文件夹下的文件。

    最开始这个这个函数的参数是某个子目录,比如我遍历的F盘,传入的参数就是:F:\

    传入这个参数之后,会在其后面添加*.*,FindFile函数在这个时候就开始查找当前目录的全部的文件和文件夹了。

    基本上啊,就是一个树的深度优先遍历。

    主函数的代码非常简单,但是能很好的完成功能:

    复制代码
     1 using namespace std;
     2 /*修改于20130625 做文件查找*/
     3 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
     4 {
     5     setlocale(LC_ALL, "chs");
     6     CString cs = _T("F:\");
     7     TraversFile(cs);
     8     system("pause");
     9     return 0;
    10 }
    复制代码

    还不错吧?

     
     
    分类: C/C++
  • 相关阅读:
    《让未来的你,感谢现在的自己》——自己努力
    老罗——《我的奋斗》
    1. opencv的初体验
    opencv初体验
    opencv的初体验
    python学习2——数据类型
    卷积的意义
    C#学习笔记一
    C++知识点
    二维数组作为参数传递
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3155647.html
Copyright © 2011-2022 走看看