我想用 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();
}
我想这样显示:
有人知道如何打印它吗?
我尝试使用 Spectre.Console,但我无法掌握它的窍门...
我找到了解决办法。 我像其他人提到的那样更新了我的模型。
文件:
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);
}
}
通过代码,我设法得到了一棵看起来像我的问题中的树。