在 C# 控制台应用程序中打印文件夹结构

问题描述 投票:0回答:1

我想用 C# 制作一个文件系统读取器。 我想打印给定路径的文件夹结构。

文件和目录的信息存储在数据库中。 使用中的型号: 文件:

    internal class File
    {
        [Key]
        public int FileID { get; set; }

        public string FileName { get; set; } = string.Empty;

        public float FileSize { get; set; }

        public DateTime CreationTime { get; set; }

        [ForeignKey("DirectoryID")]
        public int DirectoryID { get; set; }

        public Directory Directory { get; set; }
    }

目录:

    internal class Directory
    {
        [Key]
        public int DirectoryID { get; set; }

        public string DirectoryName { get; set; } = string.Empty;

        public string DirectoryPath { get; set; } = string.Empty;

        public float DirectorySize { get; set; }

        public DateTime CreationDate { get; set; }

        public List<File> Files { get; set; } = new();
    }

我想这样显示:

Found this on the internet but I don't know how to do it...

有人知道如何打印它吗?

我尝试使用 Spectre.Console,但我无法掌握它的窍门...

c# console directory-structure spectre.console
1个回答
0
投票

我找到了解决办法。 我像其他人提到的那样更新了我的模型。

文件:

public class FileModel
{
    [Key]
    public int FileModelID { get; set; }

    [Required]
    public string FileName { get; set; }

    [Required]
    public string FilePath { get; set; }

    [Required]
    public DateTime CreationDate { get; set; }

    [Required]
    public long FileSize { get; set; }

    public FolderModel Folder { get; set; }
}

文件夹:

public class FolderModel
{
    [Key]
    public int FolderModelID { get; set; }

    [Required]
    public string FolderName { get; set; }

    [Required]
    public string FolderPath { get; set; }

    [Required]
    public DateTime CreationDate { get; set; }

    [Required]
    public long FolderSize { get; set; }


    public List<FolderModel> SubFolders { get; set; } = new();

    public List<FileModel> Files { get; set; } = new();
}

为了获取文件夹结构和文件夹大小,我编写了此方法:

    public FolderModel GetFolderStructure(string path)
    {
        DirectoryInfo directory = new DirectoryInfo(path);

        FolderModel folder = new()
        {
            FolderName = directory.Name,
            CreationDate = directory.CreationTime,
            FolderPath = path,
            FolderSize = 0
        };

        folder.FolderSize = SearchFolder(folder);
        return folder;
    }

以及使其递归的 SearchFolder 方法:

private long SearchFolder(FolderModel parentFolder)
    {
        DirectoryInfo directory = new DirectoryInfo(parentFolder.FolderPath);

        long totalSize = 0;

        
        foreach(var fileInfo in directory.GetFiles())
        {
            FileModel file = new()
            {
                FileName = fileInfo.Name,
                FilePath = fileInfo.FullName,
                FileSize = fileInfo.Length,
                CreationDate = fileInfo.CreationTime
            };

            totalSize = totalSize + fileInfo.Length;

            parentFolder.Files.Add(file);
        }

        foreach (var directoryInfo in directory.GetDirectories())
        {
            FolderModel folder = new()
            {
                FolderName = directoryInfo.Name,
                FolderPath = directoryInfo.FullName,
                CreationDate = directoryInfo.CreationTime,
                FolderSize = 0
            };

            parentFolder.SubFolders.Add(folder);

            folder.FolderSize = SearchFolder(folder);

            totalSize = totalSize + folder.FolderSize;
        }
        return totalSize;
    }

使用 Spectre.Console Nuget-Package,您可以将文件夹结构打印为树。

private static void DrawTree(FolderModel rootFolder)
{
    Tree tree = new Tree(rootFolder.FolderName);

    AddNode(rootFolder, tree);

    AnsiConsole.Write(tree);
}

private static void AddNode(FolderModel folder, IHasTreeNodes node)
{
    foreach (FileModel file in folder.Files)
    {
        node.AddNode(file.FileName);
    }

    foreach (FolderModel subFolder in folder.SubFolders)
    {
        TreeNode n = node.AddNode(subFolder.FolderName);

        AddNode(subFolder, n);
    }
}

通过代码,我设法得到了一棵看起来像我的问题中的树。

© www.soinside.com 2019 - 2024. All rights reserved.