关闭

C# 输出目录结构树到Console或文本文件

576人阅读 评论(0) 收藏 举报
分类:
摘要
C# 输出目录结构树到Console或文本文件

1.关于打印目录树

前几天写文档,要解释一个目录里大部分的子目录和文件的用途,于是顺手写了一个打印文件目录树的C#工具类,可以将生成的目录树打印到Console或是文本文件中。

2.工具类源码

打印目录树工具类:DocTreeHelper

需要手动加载命名空间:System.IO

class DocTreeHelper
{
    /// <summary>
    /// 输出目录结构树
    /// </summary>
    /// <param name="dirpath">被检查目录</param>
    public static void PrintTree(string dirpath)
    {
        if (!Directory.Exists(dirpath))
        {
            throw new Exception("文件夹不存在");
        }

        PrintDirectory(dirpath, 0, ""); 
    }

    /// <summary>
    /// 将目录结构树输出到指定文件
    /// </summary>
    /// <param name="dirpath">被检查目录</param>
    /// <param name="outputpath">输出到的文件</param>
    public static void PrintTree(string dirpath, string outputpath)
    {
        if (!Directory.Exists(dirpath))
        {
            throw new Exception("文件夹不存在");
        }

        //将输出流定向到文件 outputpath
        StringWriter swOutput = new StringWriter(); 
        Console.SetOut(swOutput); 

        PrintDirectory(dirpath, 0, ""); 

        //将输出流输出到文件 outputpath
        File.WriteAllText(outputpath, swOutput.ToString()); 

        //将输出流重新定位回文件 outputpath
        StreamWriter swConsole = new StreamWriter(
            Console.OpenStandardOutput(), Console.OutputEncoding);
        swConsole.AutoFlush = true;
        Console.SetOut(swConsole);
    }

    /// <summary>
    /// 打印目录结构
    /// </summary>
    /// <param name="dirpath">目录</param>
    /// <param name="depth">深度</param>
    /// <param name="prefix">前缀</param>
    private static void PrintDirectory(string dirpath, int depth, string prefix)
    {
        DirectoryInfo dif = new DirectoryInfo(dirpath);

        //打印当前目录
        if (depth == 0)
        {
            Console.WriteLine(prefix + dif.Name);
        }
        else
        {
            Console.WriteLine(prefix.Substring(0, prefix.Length - 2) + "| ");
            Console.WriteLine(prefix.Substring(0, prefix.Length - 2) + "|-" + dif.Name);
        }

        //打印目录下的目录信息
        for (int counter = 0; counter < dif.GetDirectories().Length; counter++)
        {
            DirectoryInfo di = dif.GetDirectories()[counter]; 
            if (counter != dif.GetDirectories().Length - 1 ||
                dif.GetFiles().Length != 0)
            {
                PrintDirectory(di.FullName, depth + 1, prefix + "| ");
            }
            else
            {
                PrintDirectory(di.FullName, depth + 1, prefix + "  ");
            }
        }

        //打印目录下的文件信息
        for (int counter = 0; counter < dif.GetFiles().Length; counter++)
        {
            FileInfo f = dif.GetFiles()[counter];
            if (counter == 0)
            {
                Console.WriteLine(prefix + "|");
            }
            Console.WriteLine(prefix + "|-" + f.Name);
        }
    }
}

3.调用实例

在Main函数中输入下面的代码进行调用

class Program
{
    static void Main(string[] args)
    {
        string dirpath = @"D:\MyPrograms\Program4Use\DocumentTree";
        string outputpath = @"output.txt";

        DocTreeHelper.PrintTree(dirpath);
        DocTreeHelper.PrintTree(dirpath, outputpath);

        Console.WriteLine("Output Finished");
        Console.WriteLine("输出完毕");
        Console.ReadLine();
    }
}

4.运行效果

1)调用DocTreeHelper.PrintTree(dirpath)将目录dirpath的信息输出到控制台

2)调用DocTreeHelper.PrintTree(dirpath, outputpath)将目录dirpath的信息输出到文本文件outputpath

5.其他注意事项

1)在输出到文件的函数中,本文中的代码是先将Console的输出定位到一个流中,再在完成功能后将Console的输出定位回控制台来实现的。输出到控制台的流,编码方式应该采用Console.OutputEncoding,如果使用Encoding.ASCII,可以正确输出英文,但之后输出汉字会出现乱码。

2)不要在输出到文本文件的内容中使用字符'\b',BackSpace在文本文件中也是一个字符,它并不会将光标向前移动。

END


0
0
查看评论

Unity 实现Log实时输出到屏幕或控制台上<二>

第一部分博客链接:http://blog.csdn.net/cartzhang/article/details/49818953 一、你还是想要一个控制台来显示信息?     为什么呢?这样就不会占用Unity本身的GUI的显示,不去调用Unity的渲染,转而该为Window...
  • cartzhang
  • cartzhang
  • 2015-11-17 11:13
  • 10205

C#中将标准输出重定向到日志文件

C#中将标准shu static public void Main () { FileStream ostrm; StreamWriter writer; TextWriter oldOut = Console.Out; try { ostr...
  • salutlu
  • salutlu
  • 2014-09-14 13:53
  • 3897

C#中重新定义Console实现自动保存输出到文件

class Console { public static string ReadLine() { return System.Console.ReadLine(); } public static ConsoleKeyInfo ReadKey() ...
  • yanjianming2005
  • yanjianming2005
  • 2016-05-25 17:37
  • 1203

C# Console 应用实时覆盖输出的实现

主要应用场景就是数据的动态显示而不是全部显示, 一般为 process 的显示, sensor 数据输出等等. 主要实现方法就是修改 console 的光标显示位置. 实现方法1: for (int i = 0; i <= 100; i++) { Console.Wri...
  • zhongrurong
  • zhongrurong
  • 2017-07-26 11:22
  • 348

图解C# Console 输出和Console相关编程复习总结

1 基本控制台输出 首先进入 SharpDevelop ,新建一个控制台工程; SharpDevelop简介: http://blog.csdn.net/bcbobo21cn/article/details/44200205 using System; n...
  • bcbobo21cn
  • bcbobo21cn
  • 2016-04-20 14:36
  • 3316

C# 获取Console的输入和输出 数据 (异步)

using System ;using System .Diagnostics;using System .IO;class Program{    static void Main()    {   ...
  • muzizongheng
  • muzizongheng
  • 2013-07-10 15:42
  • 1709

C#控制台基础 使用filestream读取txt文本文件并输出到控制台

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 1、 using System; using System.Collections.Generic; using System.IO; using System.Linq; usin...
  • yushaopu
  • yushaopu
  • 2016-09-12 21:43
  • 2409

C#控制台 console.writeline 输出变量(十六进制形式与限制小数位数)

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 console.writeline 输出变量 using System; using System.Collections.Generic; using System.L...
  • yushaopu
  • yushaopu
  • 2016-07-08 11:51
  • 2615

C# 保存和读取文件

//保存数据到文件中 private void saveData_Click(object sender, EventArgs e) { SaveFileDialog file = new SaveFileDialog();//定义新的文件保存...
  • qq_40118071
  • qq_40118071
  • 2018-01-21 13:39
  • 97

MyEclipse将控制台输出信息保存到文件

1.MyEclipse里面设置:window-preferences-servers-tomcat-Launch 2.选择Tomcat launch mode,点击Create Launch Configuration 3.选中最后一个选项卡Common,选中File,输入文件路径,点击Debu...
  • jarniyy
  • jarniyy
  • 2016-01-05 17:48
  • 879
    个人资料
    • 访问:254021次
    • 积分:3971
    • 等级:
    • 排名:第9410名
    • 原创:101篇
    • 转载:295篇
    • 译文:1篇
    • 评论:28条
    博客专栏