这个程序的实现倒是相当简单,一个目录遍历的问题,先看效果,如图所示(控制台程序)
首先新建一个支持mfc的win32控制台程序...然后就是遍历目录了...在遍历目录的同时打印目录.就这么简单,没啥技术含量,主要就是那些缩进格式和线条的控制,实现也相当的简单,只要在遍历的时候用一个循环就搞定了...就不多啰嗦了.看代码吧
文件的开头首先定义两个字符串类型的常变量,作为上图中的线条的定义
- const CString V_line = "| ";
- const CString B_line = "|----";
下面是递归打印目录的函数的实现
- void DirLister(CString path,int nTabs,ofstream &outFile)
- {
- path += "//*.*";
- CFileFind filefind;
- BOOL bWorking = filefind.FindFile(path);
- while (bWorking)
- {
- bWorking = filefind.FindNextFile();
- if (filefind.IsArchived())
- {
- for (int i = 1; i <= nTabs; i++)
- {
- cout<<(LPCTSTR)V_line;
- outFile<<(LPCTSTR)V_line;
- }
- cout<<(LPCTSTR)B_line;
- outFile<<(LPCTSTR)B_line;
- cout<<(LPCTSTR)filefind.GetFileName()<<endl;
- outFile<<(LPCTSTR)filefind.GetFileName()<<endl;
-
- }
- if (filefind.IsDirectory() && !filefind.IsDots())
- {
- for (int i = 1; i <= nTabs; i++)
- {
- cout<<(LPCTSTR)V_line;
- outFile<<(LPCTSTR)V_line;
- }
- cout<<(LPCTSTR)B_line;
- outFile<<(LPCTSTR)B_line;
- cout<<(LPCTSTR)filefind.GetFileName()<<endl;
- outFile<<(LPCTSTR)filefind.GetFileName()<<endl;
- CString subPath = filefind.GetFilePath();
- DirLister(subPath,nTabs+1,outFile);
- }
- }
- filefind.Close();
- }
path 是要进入的路径,参数nTabs 就是要缩进的空格数目了.outFile是要输出的文件
每次输出都是双分的,一次是控制台输出,一次是文件输出..
程序使用的时候要给它一个参数作为要打印的目录.驱动程序如下
- int main(int argc, TCHAR* argv[], TCHAR* envp[])
- {
- int nRetCode = 0;
-
-
-
- CString modulePath;
- GetModuleFileName(NULL,modulePath.GetBuffer(MAX_PATH),MAX_PATH);
- modulePath.ReleaseBuffer();
- int nLength = modulePath.GetLength();
- int iPos = modulePath.ReverseFind('//');
-
-
- if (argc < 2)
- {
- cout<<"eg: "<<(LPCTSTR)modulePath.Right(nLength-iPos-1)<<" F://"<<endl;
- system("pause");
- return 0;
- }
-
- modulePath = modulePath.Left(iPos+1);
- CString outFileName = modulePath + "_directoryList_.txt";
- ofstream outFile(outFileName,ios::out);
- if (!outFile)
- {
- cerr<<"Can't Open write file:/n";
- system("pause");
- exit(1);
- }
- cout<<argv[1]<<endl;
- outFile<<argv[1]<<endl;
- DirLister(argv[1],1,outFile);
- outFile.close();
- system("pause");
- return nRetCode;
- }
假如使用过这些函数的话,应该很明白程序的意思了...逻辑很简单,理解程序靠注释已经足够了吧....呵呵..