c++实现对文件目录树形打印

这个程序的实现倒是相当简单,一个目录遍历的问题,先看效果,如图所示(控制台程序)

c++实现对文件目录树形打印_第1张图片

首先新建一个支持mfc的win32控制台程序...然后就是遍历目录了...在遍历目录的同时打印目录.就这么简单,没啥技术含量,主要就是那些缩进格式和线条的控制,实现也相当的简单,只要在遍历的时候用一个循环就搞定了...就不多啰嗦了.看代码吧

文件的开头首先定义两个字符串类型的常变量,作为上图中的线条的定义

  1. const CString V_line = "|    ";
  2. const CString B_line = "|----";
下面是递归打印目录的函数的实现

  1. // 此函数递归实现
  2. // 假如是文件就打印,假如是目录打印并递归到子目录下
  3. void DirLister(CString path,int nTabs,ofstream &outFile)
  4. {
  5.     path += "//*.*"
  6.     CFileFind filefind;
  7.     BOOL bWorking = filefind.FindFile(path);  // 有文件么?
  8.     while (bWorking)
  9.     {
  10.         bWorking = filefind.FindNextFile();
  11.         if (filefind.IsArchived()) // 是文档
  12.         {
  13.             for (int i = 1; i <= nTabs; i++)
  14.             {
  15.                 cout<<(LPCTSTR)V_line; // 输出一个tab
  16.                 outFile<<(LPCTSTR)V_line;
  17.             }
  18.             cout<<(LPCTSTR)B_line;
  19.             outFile<<(LPCTSTR)B_line; // 一个折线
  20.             cout<<(LPCTSTR)filefind.GetFileName()<// 文件名
  21.             outFile<<(LPCTSTR)filefind.GetFileName()<
  22.             
  23.         }
  24.         if (filefind.IsDirectory() && !filefind.IsDots()) // 目录
  25.         {
  26.             for (int i = 1; i <= nTabs; i++)
  27.             {
  28.                 cout<<(LPCTSTR)V_line; // 输出一个垂直的线
  29.                 outFile<<(LPCTSTR)V_line;
  30.             }
  31.             cout<<(LPCTSTR)B_line;
  32.             outFile<<(LPCTSTR)B_line;
  33.             cout<<(LPCTSTR)filefind.GetFileName()<
  34.             outFile<<(LPCTSTR)filefind.GetFileName()<// 目录名
  35.             CString subPath = filefind.GetFilePath();
  36.             DirLister(subPath,nTabs+1,outFile);
  37.         }
  38.     }
  39.     filefind.Close();
  40. }
path 是要进入的路径,参数nTabs 就是要缩进的空格数目了.outFile是要输出的文件

每次输出都是双分的,一次是控制台输出,一次是文件输出..

程序使用的时候要给它一个参数作为要打印的目录.驱动程序如下

  1. int main(int argc, TCHAR* argv[], TCHAR* envp[])
  2. {
  3.     int nRetCode = 0;
  4.     // initialize MFC and print and error on failure
  5. /*  if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
  6.     {
  7.         // TODO: change error code to suit your needs
  8.         cerr << _T("Fatal Error: MFC initialization failed") << endl;
  9.         nRetCode = 1;
  10.     }*/
  11.     
  12.     // 得到当前exe的目录
  13.     CString modulePath;
  14.     GetModuleFileName(NULL,modulePath.GetBuffer(MAX_PATH),MAX_PATH);
  15.     modulePath.ReleaseBuffer();
  16.     int nLength = modulePath.GetLength();
  17.     int iPos = modulePath.ReverseFind('//');
  18.     
  19.     // 参数必须是两个
  20.     if (argc < 2)
  21.     {   //当前 exe的名字 + 一个示例
  22.         cout<<"eg: "<<(LPCTSTR)modulePath.Right(nLength-iPos-1)<<" F://"<
  23.         system("pause");
  24.         return 0;
  25.     }
  26.     // exe的目录下新建文件_result_.txt
  27.     modulePath = modulePath.Left(iPos+1);
  28.     CString outFileName = modulePath + "_directoryList_.txt";
  29.     ofstream outFile(outFileName,ios::out);
  30.     if (!outFile)  // 创建文件失败
  31.     {
  32.         cerr<<"Can't Open write file:/n";
  33.         system("pause");
  34.         exit(1);
  35.     }
  36.     cout<// 首先输出要列出的目录名
  37.     outFile<
  38.     DirLister(argv[1],1,outFile); // 递归函数的调用
  39.     outFile.close(); 
  40.     system("pause");
  41.     return nRetCode;
  42. }
假如使用过这些函数的话,应该很明白程序的意思了...逻辑很简单,理解程序靠注释已经足够了吧....呵呵..


你可能感兴趣的:(MFC/C++,c++,path,mfc,exe,null)