Linux下C#设置文件权限应优先使用.NET 5+的File.SetUnixFileMode,它直接调用chmod()系统调用;旧版本需通过Process.Start("chmod")回退;File.SetAttributes在Linux无效,UnixFileSystem非公开API不可直接调用。

Linux下C#无法直接调用chmod,得靠UnixFileSystem
在.NET Core 2.1+ 和 .NET 5+ 中,File.SetAttributes 对 Linux 文件权限完全无效——它只影响 Windows 的只读/隐藏等属性。真正能设置 chmod 权限(如 0755)的是 UnixFileSystem,但它不是公开 API,必须通过 FileSystemInfo 的扩展机制间接使用。
关键前提:项目必须引用 System.IO.FileSystem.AccessControl(仅 Windows)不行;Linux 下真正起作用的是 Microsoft.NETCore.App 自带的 Unix-specific 实现,且需确保运行时是 Linux(或 WSL),Windows 上调用会静默失败或抛 PlatformNotSupportedException。
用File.SetUnixFileMode设置rwx权限
.NET 5+ 在 System.IO 中添加了 File.SetUnixFileMode(以及对应的 GetUnixFileMode),这是目前最直接、跨发行版兼容的方式。它接受 UnixFileMode 枚举组合值,底层调用 chmod() 系统调用。
-
File.SetUnixFileMode("/path/to/file", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute)等价于chmod u+rwx - 要设八进制
0644,可写成:UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.GroupRead | UnixFileMode.OtherRead - 注意:该方法不递归,目录本身权限可设,但子项不受影响;如需
chmod -R效果,得自己遍历 - 若路径不存在,抛
FileNotFoundException;无权限时抛UnauthorizedAccessException
DirectoryInfo和FileInfo也能设,但有陷阱
FileInfo 和 DirectoryInfo 都有 SetUnixFileMode 实例方法,用法一致,但容易忽略两个细节:
- 必须先调用
Exists或确保路径真实存在,否则方法不报错但实际不生效(尤其对刚创建的文件,可能因缓存未刷新) -
DirectoryInfo设权限时,不会自动加UnixFileMode.Directory标志——你得显式包含它,否则目录可能变成不可进入状态。例如:dirInfo.SetUnixFileMode(UnixFileMode.Directory | UnixFileMode.UserRead | UnixFileMode.UserExecute) - 枚举值不能靠数值硬转,比如
(UnixFileMode)0755是错的——UnixFileMode不是 [Flags] 位域的简单数字映射,必须用组合逻辑或查表转换
没有.NET版本支持?回退到Process.Start("chmod")
如果还在用 .NET Core 2.1–3.1,或者需要兼容极旧环境,SetUnixFileMode 不可用。此时唯一可靠方式是调用系统 chmod:
var startInfo = new ProcessStartInfo("chmod", "755 /path/to/file")
{
RedirectStandardError = true,
UseShellExecute = false
};
using var p = Process.Start(startInfo);
p.WaitForExit();
if (p.ExitCode != 0)
{
var error = p.StandardError.ReadToEnd();
throw new IOException($"chmod failed: {error}");
}
注意:UseShellExecute = false 必须设,否则在容器或最小化系统中可能找不到 shell;路径里含空格时,参数要额外加引号;频繁调用会带来进程开销,不适合高频场景。
权限设置本身不难,难的是确认运行上下文是否真有 chmod、目标路径是否挂载为可执行、以及 umask 是否干扰了最终结果——这些往往比代码更耗排查时间。










