You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:03:11