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

时间: 2024-08-29 20:52:43

C# 输出目录结构树到Console或文本文件的相关文章

makefile--统一目标输出目录 (六)

原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 上一节我们把规则单独提取出来,方便了Makefile的维护,每个模块只需要给出关于自己的一些变量,然后再使用统一的规则Makefile.这一节我 们继续改进我们的Makefile,到目前为止我们的Makefile编译链接输出的目标都在源文件同目录下或模块Makefile同一目录下,当一个项 目大了之后,这样会显得很乱,寻找编译输出的文件也比较困难.既然Makefile本身就是按照我们的的规则来

从头开始写项目Makefile(七):统一目标输出目录

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 上一节我们把规则单独提取出来,方便了Makefile的维护,每个模块只需要给出关于自己的一些变量,然后再使用统一的规则Makefile.这一节我们继续改进我们的Makefile,到目前为止我们的Makefile编译链接输出的目标都在源文件同目录下或模块Makefile同一目录下,当一个项目大了之后,这样会显得很乱,寻找编译输出的文件也比较困难.既然Makefil

更改gradle的java的class文件输出目录的结构

gradle虽然也是一个convention over configuration的工具. gradle是一个新的构建工作可以更改它的convention. //指定gradle的class文件输出目录,同时去掉java的文件夹 output.classesDir = 'WebContent/WEB-INF/classes'

hadoop配置(4) --在每次运行时自动删除输出目录

运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录.在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作: Configuration conf = new Configuration(); Job job = new Job(conf); /* 删除输出目录 */ Path outputPath = new Path(args[1]); outputPath

php遍历目录输出目录及其下的所有图片文件

在做网站的时候,需要给文章内所有的图片添加上logo,如何利用ThinkPHP来实现. ThinkPHP为我们很好的提供了图像处理类,给文章中的所有图片加上水印的思路,上传的图片文件都保存在一个文件夹下面,我只需要获取该文件夹以及子文件夹下面的所有图片,遍历一次,加上水印即可,因此目前的难度只是怎么获取文件中的图片,并且遍历一次即可.[在ImagesController控制器中具体会出现二维数组的遍历]:因此添加水印的图片问题就转换成了利用PHP遍历目录输出目录及其下的所有图片文件 //遍历目录

vs文件属性(复制到输出目录)是什么意思

右击项目里的文件,选择属性(F4)会有复制到输出目录的选项. 它提供三项选择,如图: 如果选择始终复制或如果较新则复制会在该程序集的bin目录下生成该文件,如图:

修改文件输出目录后,提示配置错误(VS2010)

问题:C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(990,5): warning MSB8012: TargetPath(E:\WorkPro\MisIntubation\Debug\MisIntubationUI.exe) 与 Linker 的 OutputFile 属性值(E:\WorkPro\MisIntubation\dist\MisIntubationUI.exe)不匹配.这可

RIDE指定log和report的输出目录

在命令行中,输入 pybot --help就可以看到他支持的所以命令和相关的介绍 我们可以看到outputdir这个命令,就是来知道report和log的输出目录的 如果你是在命令行中,那么直接后面跟 -d 或者 --outputdir 目录 即可 如果你是在ride中运行,那么请在以下位置写即可

VS工作目录,输出目录

C++项目,解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹(共四个东东,其中Debug和Release文件夹中存放最终生成的结果exe或dll,要注意如果不使用Release生成,则不存在Release文件夹),而项目总文件夹下包含C++源文件头文件.项目配置文件和一个Debug文件夹以及一个Release文件夹(一定要注意,此处的Debug和Release文件夹仅仅存放中间编译结果obj,不存放exe和dll之类的东西.如果