【.net 深呼吸】將目錄樹轉化為文本


大伙都知道,文件系統是樹形結構的,有時候我們會想到把目錄的層次結構變為純文本形式,就像這樣:

├─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

 

怎么樣,這樣來耍,是不是比用鼠標敲腦袋的方式輕松簡便多了。有興趣的伙伴們,趕緊回家耍耍吧。

 

示例源代碼下載。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM