大伙都知道,文件系統是樹形結構的,有時候我們會想到把目錄的層次結構變為純文本形式,就像這樣:
├─Windows-universal-samples-master │ ├─Samples │ │ ├─3DPrintingFromUnity │ │ │ └─Assets │ │ │ └─Script │ │ ├─Accelerometer │ │ │ ├─cpp │ │ │ ├─cs │ │ │ ├─js │ │ │ │ ├─css │ │ │ │ ├─html │ │ │ │ ├─js │ │ │ │ ├─Microsoft.WinJS.4.0 │ │ │ │ │ ├─css │ │ │ │ │ ├─fonts │ │ │ │ │ └─js │ │ │ │ │ └─en-us │ │ │ │ └─sample-utils │ │ │ ├─shared │ │ │ └─vb │ │ ├─ActivitySensor │ │ │ ├─cpp │ │ │ │ └─Tasks │ │ │ ├─cs │ │ │ │ └─Tasks │ │ │ │ └─Properties │ │ │ ├─js
有朋友可能會開始構思復雜的算法了,當然了,你如果自己能想出來並做出來,也是值得稱贊的。其實,我們並不需要勞神費思地去想破腦子,因為 Windows 系統自身有一個 tree 命令,這個命令可以將指定目錄以及它的子目錄結構生成文本內容。
tree 命令的用法也簡單,比如:
tree E:\
按回車后,就會將E盤下的所有目錄結構生成一大串文本。
如果希望生成的文本包含文件,那就在命令的后面加一個 /f 參數。如:
tree E:\電子文檔 /f
命令顯示E:\電子文檔 目錄下的子目錄結構,並連同其中的文件,轉化為文本形式。
好了,有了以上的知識認知,再來弄我們的程序代碼就好辦了。思路就是在程序中執行 tree 命令,那怎么做到呢,不難,運行 cmd.exe,然后把 tree 命令作為參數傳入即可。比如要生成C盤下的目錄結構,就執行:
cmd.exe /C tree C:\
/C 表示CMD執行完后就退出,如果是 /K 的話,CMD執行完命令后會暫停,等待用戶后續操作。因為我們這里是在程序中調用的,應該用 /c 參數,並不顯示CMD窗口。
Process 類可以勝任這一工作,用它可以啟動一個新進程並執行必要的操作。
下面給大家看看例子。
ProcessStartInfo info = new ProcessStartInfo(); string cmdParm = "/C " + "tree \"" + textBox1.Text + "\""; // 要執行的文件為cmd info.FileName = "cmd.exe"; // 命令行參數 info.Arguments = cmdParm; info.RedirectStandardError = info.RedirectStandardOutput = true; info.UseShellExecute = false; //必須為false info.CreateNoWindow = true; //無窗口顯示 // 啟動新進程 Process p = Process.Start(info); // 讀取輸出結果 string res = p.StandardOutput.ReadToEnd(); if (!p.HasExited) { // 如果進程還沒退出,就kill了它 p.Kill(); }
代碼不復雜,但要注意以下幾點:
1、命令行參數在目錄路徑的地方最好用雙引號,即 cmd.exe /C tree "d:\my",這是防止路徑中含有空格,比如 Program Files這樣的目錄名,加了雙引號會被視為一個參數,如果不加,遇到空格就會被認為是兩個參數。
2、UseShellExecute 應為 false,CreateNoWindow 也要為 true,表示運行CMD時不顯示DOS窗口。
3、一定要把 RedirectStandardOutput 設置為 true,因為如果不這樣做,Process 實例的 StandardOutput 屬性就無法讀取CMD的輸出結果,我們就得不到目錄樹的文本了。這個屬性是把 CMD 窗口的輸出流重定向到我們的應用程序中,這樣才能供程序讀取。而 RedirectStandardError 是否為 true不重要,除非你要在程序中讀出錯誤信息。
4、必須在新進程序已經執行后,才能從 Process 的 StandarOutput 屬性讀取結果,如果進程未執行是沒有可用結果的。
現在,運行示例,然后選擇一個目錄,試試看。
├─Projects
│ ├─makeTreeApp
│ │ └─makeTreeApp
│ │ ├─bin
│ │ │ └─Debug
│ │ ├─obj
│ │ │ └─Debug
│ │ │ └─TempPE
│ │ └─Properties
│ └─MySub
│ ├─RunApp
│ │ ├─bin
│ │ │ ├─Debug
│ │ │ └─Release
│ │ ├─obj
│ │ │ ├─Debug
│ │ │ │ └─TempPE
│ │ │ └─Release
│ │ │ └─TempPE
│ │ └─Properties
│ └─TestLib
│ ├─bin
│ │ ├─Debug
│ │ └─Release
怎么樣,這樣來耍,是不是比用鼠標敲腦袋的方式輕松簡便多了。有興趣的伙伴們,趕緊回家耍耍吧。