C#文件夹访问权限获取及递归文件分析程序扩展问题
问题1:如何在C#中获取文件夹的访问权限?
可以通过Directory.GetAccessControl方法获取文件夹的访问控制列表(ACL),从中提取用户或组的权限信息:
using System.Security.AccessControl; using System.Security.Principal; public static void GetFolderPermissions(string folderPath) { DirectorySecurity dirSecurity = Directory.GetAccessControl(folderPath); AuthorizationRuleCollection rules = dirSecurity.GetAccessRules(true, true, typeof(NTAccount)); foreach (FileSystemAccessRule rule in rules) { Console.WriteLine($"用户/组: {rule.IdentityReference.Value}"); Console.WriteLine($"权限: {rule.FileSystemRights}"); Console.WriteLine($"类型: {rule.AccessControlType}"); Console.WriteLine("---"); } }
这段代码会枚举目标文件夹的所有权限规则,输出每个用户/组对应的权限类型(允许/拒绝)和具体权限(如读取、写入、修改等)。
问题2:扩展C#递归文件分析程序的展示数据
针对你的Spectre Console目录树程序,我们可以扩展DirectoryInfo和FileInfo的可展示数据,包括文件/文件夹大小、文件属性、访问权限等,以下是修改后的完整代码:
using Spectre.Console; using System.Security.AccessControl; using System.Security.Principal; class Program { static void Main(string[] args) { string path = @"C:\Users\MogliMehmet\Desktop\Test"; Tree tree = new Tree(path); TraverseTree(path, tree); AnsiConsole.Write(tree); } private static void TraverseTree(string path, IHasTreeNodes node) { DirectoryInfo dir = new DirectoryInfo(path); // 计算文件夹大小 long dirSize = GetDirectorySize(dir); // 获取文件夹权限摘要 string dirPermissions = GetPermissionSummary(dir.FullName); // 获取文件夹属性 string dirAttributes = dir.Attributes.ToString(); var dirNode = node.AddNode(new Markup("[blue]" + dir.Name + "[/]")); dirNode.AddNode(new Markup($"Erstellt am: [green]{dir.CreationTime}[/]")); dirNode.AddNode(new Markup($"Letzter Zugriff: [green]{dir.LastAccessTime}[/]")); dirNode.AddNode(new Markup($"Zuletzt geändert: [green]{dir.LastWriteTime}[/]")); dirNode.AddNode(new Markup($"Größe: [green]{FormatFileSize(dirSize)}[/]")); dirNode.AddNode(new Markup($"Attribute: [green]{dirAttributes}[/]")); dirNode.AddNode(new Markup($"Berechtigungen: [green]{dirPermissions}[/]")); FileInfo[] files = dir.GetFiles(); if (files.Length > 0) { var filesNode = dirNode.AddNode("Dateien"); foreach (FileInfo file in files) { // 获取文件权限摘要 string filePermissions = GetPermissionSummary(file.FullName); filesNode.AddNode(new Markup($"DateiName: [yellow]{file.FullName}[/]")); filesNode.AddNode(new Markup($"Letzter Zugriff: [yellow]{file.LastAccessTime}[/]")); filesNode.AddNode(new Markup($"Zuletzt geändert: [yellow]{file.LastWriteTime}[/]")); filesNode.AddNode(new Markup($"Größe: [yellow]{FormatFileSize(file.Length)}[/]")); filesNode.AddNode(new Markup($"Attribute: [yellow]{file.Attributes.ToString()}[/]")); filesNode.AddNode(new Markup($"Berechtigungen: [yellow]{filePermissions}[/]")); } } DirectoryInfo[] dirs = dir.GetDirectories(); if (dirs.Length > 0) { foreach (DirectoryInfo dirSingle in dirs) { TraverseTree(dirSingle.FullName, dirNode); } } } // 递归计算文件夹大小 private static long GetDirectorySize(DirectoryInfo dir) { long size = 0; // 计算当前目录下文件大小 foreach (FileInfo file in dir.GetFiles()) { size += file.Length; } // 递归计算子目录大小 foreach (DirectoryInfo subDir in dir.GetDirectories()) { size += GetDirectorySize(subDir); } return size; } // 格式化文件大小为易读格式 private static string FormatFileSize(long bytes) { string[] sizes = { "B", "KB", "MB", "GB", "TB" }; double len = bytes; int order = 0; while (len >= 1024 && order < sizes.Length - 1) { order++; len /= 1024; } return $"{len:0.##} {sizes[order]}"; } // 获取权限摘要(简化展示) private static string GetPermissionSummary(string path) { try { DirectorySecurity dirSec = Directory.Exists(path) ? Directory.GetAccessControl(path) : File.GetAccessControl(path); var rules = dirSec.GetAccessRules(true, true, typeof(NTAccount)); return rules.Cast<FileSystemAccessRule>() .Take(2) .Select(r => $"{r.IdentityReference.Value}: {r.FileSystemRights}") .Aggregate((a, b) => $"{a}, {b}") + (rules.Count > 2 ? "..." : ""); } catch (UnauthorizedAccessException) { return "Zugriff verweigert"; } } }
新增功能说明:
- 文件夹大小:通过递归方法
GetDirectorySize计算整个目录的总大小,并通过FormatFileSize格式化为易读的B/KB/MB等单位 - 文件/文件夹属性:直接读取
Attributes属性,展示只读、隐藏、系统等标记 - 权限摘要:通过
GetPermissionSummary获取并简化展示关键权限信息,处理无访问权限的情况 - 优化布局:将原有的单行多信息拆分为多行节点,提升目录树的可读性
内容的提问来源于stack exchange,提问作者MogliMehmet
相关产品推荐
相关产品推荐

