大伙都知道,文件系统是树形结构的,有时候我们会想到把目录的层次结构变为纯文本形式,就像这样:

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

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

示例源代码下载。

【.net 深呼吸】将目录树转化为文本的更多相关文章

  1. python实现的txt目录树

    首先,我先表述一下我的需求: 我记笔记比较乱,但我比较容易"半途而废".文件夹很多,但大都只有一两个文件.... 所以我需要一种方式,能在不逐个打开文件夹的前提下,"看到 ...

  2. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  3. Android原生PDF功能实现:PDF阅读、PDF页面跳转、PDF手势伸缩、PDF目录树、PDF预览缩略图

    1.背景 近期,公司希望实现安卓原生端的PDF功能,要求:高效.实用. 经过两天的调研.编码,实现了一个简单Demo,如上图所示. 关于安卓原生端的PDF功能实现,技术点还是很多的,为了咱们安卓开发的 ...

  4. python GUI编程tkinter示例之目录树遍历工具

    摘录 python核心编程 本节我们将展示一个中级的tkinter应用实例,这个应用是一个目录树遍历工具:它会从当前目录开始,提供一个文件列表,双击列表中任意的其他目录,就会使得工具切换到新目录中,用 ...

  5. Expression表达式目录树

    一.初识Expression 1.在上一篇我们讲到了委托(忘记了可以在看看,点赞在看养成习惯),今天要讲的Expression也和委托有一点点关系吧(没有直接关系,只是想要大家看看我其他的文章),Ex ...

  6. python 小程序 复制目录树

    1. 将一个目录树完全复制到另外一个目录下面 import os, sys """ 复制目录树 """ maxloadsize = 1024 ...

  7. vs切换当前编辑文件时自动定位目录树

    在编辑区,切换当前编辑文件时(单击.cpp或.h文件选项卡),"解决方案资源管理器"目录树会自动定位当前编辑的文件,并以灰色标识,当一个解决方案中的工程数目数目很多,每个工程下面又 ...

  8. 14.KVM安装之脚本和镜像目录树准备

    1.php脚本需要先安装PHP环境,Apache服务器必须支持PHP $ yum install -y php    #安装PHP $ php -v                      #查看是 ...

  9. HBase 在HDFS 上的目录树

         总所周知,HBase 是天生就是架设在 HDFS 上,在这个分布式文件系统中,HBase 是怎么去构建自己的目录树的呢? 这里只介绍系统级别的目录树. 一.0.94-cdh4.2.1版本 系 ...

随机推荐

  1. Javascript生成二维码(QR)

    网络上已经有非常多的二维码编码和解码工具和代码,很多都是服务器端的,也就是说需要一台服务器才能提供二维码的生成.本着对服务器性能的考虑,这种小事情都让服务器去做,感觉对不住服务器,尤其是对于大流量的网 ...

  2. Android raw to bmp

    Android raw 格式转 bmp 图像 raw 保存的为裸数据,转换时都需要把它转成RGBA 的方式来显示.其中: 8位RAW: 四位RGBA 来表示一位灰度; 24位RAW: 三位RGB相同, ...

  3. runtime梳理。

    一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...

  4. 开发者接入 基本配置 服务器配置 out.aspx

    页面代码: 前段为默认的,什么都不用写,后台如下: 即可 来自为知笔记(Wiz)

  5. Angularjs参考框架地址

    1.Table(Grid)参考地址 https://github.com/samu/angular-table https://github.com/daniel-nagy/md-data-table ...

  6. PHP之Memcache缓存详解

         Mem:memory缩写(内存):内存缓存 1.  断电或者重启服务器内存数据即消失,即临时数据: Memcache默认端口:11211 存入方式:key=>>value    ...

  7. mysql百万级分页优化

    普通分页 数据分页在网页中十分多见,分页一般都是limit start,offset,然后根据页码page计算start , 这种分页在几十万的时候分页效率就会比较低了,MySQL需要从头开始一直往后 ...

  8. grep 查找bash脚本中的注释代码

    出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...

  9. Spring MVC重定向和转发以及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  10. SpringMvc中初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...