excel 在Windows应用程序中使用C#.net获取目录及其子文件夹和文件的树结构[已关闭]

lf3rwulv  于 2023-04-07  发布在  Windows
关注(0)|答案(2)|浏览(106)

已关闭,该问题需要details or clarity,目前不接受回答。
**想要改进此问题?**通过editing this post添加详细信息并澄清问题。

8年前关闭。
Improve this question
我有一个目录'0'(比方说)和子文件夹和文件如下所示

0-
 0.1
    0.1.1
         A.rdb  
         B.xml
     0.1.2
         A.rdb  
         B.xml
 0.2
    0.2.1
         A.rdb  
         B.xml
     0.1.2
         A.rdb  
         B.xml

下面是我使用的代码,

List<string> folders = new List<string>();
        DirectoryInfo di = new DirectoryInfo(textBox1.Text);
        IEnumerable<string> IEstring;
        IEstring = from subdirectory in di.GetDirectories()
                   where subdirectory.GetFiles("*.*", SearchOption.AllDirectories).Length > 0
                   select subdirectory.Name;
        folders = IEstring.ToList();
        List<String> files = DirSearch(textBox1.Text);
        textBox2.Text = textBox2.Text+ displayMembers(files);

问题是我无法打印这个名为“文件”的列表,我不知道我在这里做错了什么。
我还需要文件夹和文件的结果打印在新的Excel电子表格。结果显示是一样的

0-
     0.1
        0.1.1
             A.rdb  
             B.xml
         0.1.2
             A.rdb  
             B.xml
     0.2
        0.2.1
             A.rdb  
             B.xml
         0.1.2
             A.rdb  
             B.xml

但在电子表格里。

62o28rlo

62o28rlo1#

方法一

HierarchicalItem保存了我们需要的关于文件夹中的项目的信息。项目可以是文件夹或文件。

class HierarchicalItem
{
    public string Name;
    public int Deepth;

    public HierarchicalItem(string name, int deepth)
    {
        this.Name = name;
        this.Deepth = deepth;
    }
}

SearchDirectory是递归函数,用于将树结构转换并展平为列表

static IEnumerable<HierarchicalItem> SearchDirectory(DirectoryInfo directory, int deep = 0)
    {
        yield return new HierarchicalItem(directory.Name, deep);

        foreach (var subdirectory in directory.GetDirectories())
            foreach (var item in SearchDirectory(subdirectory , deep + 1))
                yield return item;

        foreach (var file in directory.GetFiles())
            yield return new HierarchicalItem(file.Name, deep + 1);
    }

示例:

//fake TextBox...
        var textBox1 = new { Text = @"D:\Code\C#" };
        var directory = new DirectoryInfo(textBox1.Text);

        var items = SearchDirectory(directory);

        //you can print it to a console
        foreach (var item in items)
            Console.WriteLine(string.Concat(Enumerable.Repeat('\t', item.Deepth)) + item.Name);

        //or a textbox
        textBox1.Text = string.Join("\n", items.Select(i =>
            string.Concat(Enumerable.Repeat('\t', i.Deepth)) + i.Name));

        //or a table
        for (int i = 0; i < items.Count(); i++)
        {
            //with row = i, and column = items[i].Deepth + 1
        }

方法二

这个递归方法像CommandLine中的tree命令一样打印目录

static string ScanFolder(DirectoryInfo directory, string indentation = "\t", int maxLevel = -1, int deep = 0)
    {
        StringBuilder builder = new StringBuilder();

        builder.AppendLine(string.Concat(Enumerable.Repeat(indentation, deep)) + directory.Name);

        if (maxLevel == -1 || deep < maxLevel )
        {
            foreach (var subdirectory in directory.GetDirectories())
                builder.Append(ScanFolder(subdirectory, indentation, maxLevel, deep + 1));
        }

        foreach (var file in directory.GetFiles())
            builder.AppendLine(string.Concat(Enumerable.Repeat(indentation, deep + 1)) + file.Name);

        return builder.ToString();
    }
cwtwac6a

cwtwac6a2#

这能让你更接近吗?

Func<DirectoryInfo, int, IEnumerable<string>> fetch = null;
fetch =
    (di, l) =>
        new [] { "".PadLeft(l * 4) + di.Name }
            .Concat(di.GetDirectories().SelectMany(di2 => fetch(di2, l + 1)))
            .Concat(di.GetFiles().Select(
                fi => "".PadLeft((l + 1) * 4) + fi.Name));

请注意,null赋值是必需的,因为Func是递归的。
你可以这样称呼它:

var results =
    fetch(new DirectoryInfo(@"C:\Top Folder"), 0)
        .ToList();

相关问题