zoukankan      html  css  js  c++  java
  • 【.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

    怎么样,这样来耍,是不是比用鼠标敲脑袋的方式轻松简便多了。有兴趣的伙伴们,赶紧回家耍耍吧。

    示例源代码下载。

  • 相关阅读:
    双机信任关系
    VCS双机原理
    VCS常用指令
    TCL数组
    TCL数据类型
    TCL列表
    TCL基本语法
    CentOS防火墙中端口的开启和关闭
    会话保持技术及原理技术
    ESN
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/5474506.html
Copyright © 2011-2022 走看看