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

C#调用File.SetAccessControl提示无方法定义的解决方法

报错原因

这个报错的核心原因是版本API差异:.NET Core 3.0、.NET 5及之后的所有现代.NET版本中,GetAccessControl、SetAccessControl方法已经从静态类File中移除,不再作为File的静态方法存在。
你安装的System.IO.FileSystem.AccessControl包确实包含这两个方法,但它们是作为实例扩展方法定义在FileSystemAclExtensions类中,作用于FileInfo类的实例,不能直接通过File.xxx()的静态方式调用。
如果是.NET Framework 2.0及以上版本项目出现该报错,一般是程序集引用缺失或目标框架配置错误,这类场景下SetAccessControl是File类原生静态方法,不需要额外安装NuGet包。

修复步骤
  • 确认NuGet包安装正确:现代.NET项目只需要安装和项目框架版本匹配的正式版System.IO.FileSystem.AccessControl包即可,它会自动引入System.Security.AccessControl依赖,不需要单独安装后者。注意包版本不要低于4.7.0,避免兼容性问题。
  • 调整代码中ACL相关的调用逻辑:不再直接调用File类的静态方法,先实例化对应文件的FileInfo对象,再通过该对象调用GetAccessControl和SetAccessControl方法。
  • 现有代码中System.IO、System.Security.AccessControl的using引用不需要调整,已经满足要求。
  • 如果修改后仍有报错提示,清理解决方案,删除项目下的bin、obj文件夹后重新还原NuGet包再编译,排除缓存导致的假报错。
  • 额外注意:该套ACL API仅支持Windows系统,在Linux、macOS下运行会抛出平台不支持异常,因为非Windows系统没有NTFS ACL权限机制。
修正后的完整代码
using System;
using System.IO;
using System.Security.AccessControl;

namespace FileSystemExample
{
    class FileExample
    {
        public static void Main()
        {
            try
            {
                string fileName = "test.xml";

                Console.WriteLine("Adding access control entry for "
                    + fileName);

                // Add the access control entry to the file.
                AddFileSecurity(fileName, @"DomainName\AccountName",
                    FileSystemRights.ReadData, AccessControlType.Allow);

                Console.WriteLine("Removing access control entry from "
                    + fileName);

                // Remove the access control entry from the file.
                RemoveFileSecurity(fileName, @"DomainName\AccountName",
                    FileSystemRights.ReadData, AccessControlType.Allow);

                Console.WriteLine("Done.");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

        // Adds an ACL entry on the specified file for the specified account.
        public static void AddFileSecurity(string fileName, string account,
            FileSystemRights rights, AccessControlType controlType)
        {
            FileInfo fileInfo = new FileInfo(fileName);
            // Get a FileSecurity object that represents the
            // current security settings.
            FileSecurity fSecurity = fileInfo.GetAccessControl();

            // Add the FileSystemAccessRule to the security settings.
            fSecurity.AddAccessRule(new FileSystemAccessRule(account,
                rights, controlType));

            // Set the new access settings.
            fileInfo.SetAccessControl(fSecurity);
        }

        // Removes an ACL entry on the specified file for the specified account.
        public static void RemoveFileSecurity(string fileName, string account,
            FileSystemRights rights, AccessControlType controlType)
        {
            FileInfo fileInfo = new FileInfo(fileName);
            // Get a FileSecurity object that represents the
            // current security settings.
            FileSecurity fSecurity = fileInfo.GetAccessControl();

            // Remove the FileSystemAccessRule from the security settings.
            fSecurity.RemoveAccessRule(new FileSystemAccessRule(account,
                rights, controlType));

            // Set the new access settings.
            fileInfo.SetAccessControl(fSecurity);
        }
    }
}

内容的提问来源于stack exchange,提问作者Katzer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:01:06