【问题标题】:How to populate a tree recursively from a directory listing file?如何从目录列表文件中递归地填充树?
【发布时间】:2020-01-11 06:12:13
【问题描述】:

我有一个 windows 目录的递归目录列表文件,如下所示。

 Volume in drive D is DATA
 Volume Serial Number is A4EC-104D

 Directory of D:\Studies\Projects\test

14/07/2019  08:09 PM    <DIR>          .
14/07/2019  08:09 PM    <DIR>          ..
14/07/2019  08:08 PM    <DIR>          Test1
               0 File(s)              0 bytes

 Directory of D:\Studies\Projects\test\Test1

14/07/2019  08:08 PM    <DIR>          .
14/07/2019  08:08 PM    <DIR>          ..
14/07/2019  08:08 PM    <DIR>          Test2
14/07/2019  08:08 PM    <DIR>          Test3
               0 File(s)              0 bytes

 Directory of D:\Studies\Projects\test\Test1\Test2

14/07/2019  08:08 PM    <DIR>          .
14/07/2019  08:08 PM    <DIR>          ..
14/07/2019  08:08 PM    <DIR>          Test4
               0 File(s)              0 bytes

 Directory of D:\Studies\Projects\test\Test1\Test2\Test4

14/07/2019  08:08 PM    <DIR>          .
14/07/2019  08:08 PM    <DIR>          ..
14/07/2019  08:08 PM                 0 testfile.txt
               1 File(s)              0 bytes

 Directory of D:\Studies\Projects\test\Test1\Test3

14/07/2019  08:08 PM    <DIR>          .
14/07/2019  08:08 PM    <DIR>          ..
14/07/2019  08:08 PM                 0 file2.txt
               1 File(s)              0 bytes

     Total Files Listed:
               2 File(s)              0 bytes
              14 Dir(s)  372,031,488,000 bytes free

我想从上面的文件中将TreeView 填充到C# 中,应该类似于下图

我是编程新手,想获得一些关于如何解决这个问题的提示。这是否需要任何递归函数调用?代码 sn-p 或伪代码解决方案会很棒。

【问题讨论】:

  • 您可以使用递归函数(但您不必这样做)。到目前为止你有没有尝试过?
  • 递归有它的位置。所以,如果你想学习如何去做:去做吧。如果您正在编写富有成效的代码:我不建议您这样做。特别是如果您没有编写大量递归代码,则很有可能会搞砸。
  • 您可以在调用提取方法时使用 System.IO.Directory.GetDirectories() 和 System.IO.Directory.GetFiles()。
  • 这也是了解Composite Design 模式的好时机,(dotnettricks.com/learn/designpatterns/…)

标签: c# recursion treeview


【解决方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using System.Globalization;

namespace WindowsFormsApplication52
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"c:\temp\test.txt";
        public Form1()
        {
            InitializeComponent();

            FILEITEM.ParseFile(FILENAME, this);

            FILEITEM.MakeTree(FILEITEM.files, null, treeView1, 0);

            treeView1.ExpandAll();

        }
    }
    public class FILEITEM
    {
        const string DIRECTORY_OF = "Directory of";
        const string REGEX_DATE_PATTERN = @"\d{2}/\d{2}/\d{4}\s\s\d{2}:\d{2}\s[AP]M";
        const string REGEX_FILENAME_PATTERN = @"[^\s]+";

        public static List<FILEITEM> files = new List<FILEITEM>();
        public string[] folder { get; set; }
        public string filename { get; set; }
        public DateTime time { get; set; }

        public static void ParseFile(string filename, Form1 form1)
        {
            CultureInfo info = CultureInfo.InvariantCulture;
            StreamReader reader = new StreamReader(filename);

            string[] directory = null;

            string line = "";
            while ((line = reader.ReadLine()) != null)
            {
                if (line.Contains(DIRECTORY_OF))
                {
                    directory = line.Substring(line.IndexOf(DIRECTORY_OF) + DIRECTORY_OF.Length).Trim().Split(new char[] {'\\'}).ToArray();
                }
                else
                {
                    Match dateMatch = Regex.Match(line, REGEX_DATE_PATTERN);
                    if (dateMatch.Success && !line.Contains("<DIR>"))
                    {
                        Match filenameMatch = Regex.Match(line.Trim(), REGEX_FILENAME_PATTERN, RegexOptions.RightToLeft);
                        FILEITEM newFileItem = new FILEITEM() { folder = directory, filename = filenameMatch.Value, time = DateTime.ParseExact(dateMatch.Value, "dd/MM/yyyy  hh:mm tt", info) };
                        files.Add(newFileItem);
                    }
                }
            }

        }
        public static void MakeTree(List<FILEITEM> files, TreeNode node, TreeView treeview1, int index)
        {
            TreeNode childNode = null;
            var groups = files.Where(x => x.folder.Length > index).GroupBy(x => x.folder[index]).ToList();
            foreach(var group in groups)
            {
                childNode = new TreeNode(group.Key);
                if (node == null)
                {
                    treeview1.Nodes.Add(childNode);
                }
                else
                {
                    node.Nodes.Add(childNode);
                }
                foreach (FILEITEM item in group)
                {
                    if (item.folder.Length - 1 == index)
                    {
                        TreeNode fileNode = new TreeNode(string.Join(",", new string[] { item.filename, item.time.ToLongDateString() + "  " + item.time.ToLongTimeString() }));
                        childNode.Nodes.Add(fileNode);
                    }
                }
                MakeTree(group.ToList(), childNode, null, index + 1);
            }
        }

    }
}

【讨论】:

  • 酷!这以我正在寻找的确切方式完成工作:)
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2021-12-11
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2016-07-11
相关资源
最近更新 更多