我想學習如何使用.NET核心在Linux/Unix上設置文件權限。我已經在這裏發現了一個問題,指向System.IO.FileSystem的方向,但我似乎找不到有關如何使用它的任何文檔。使用.NET核心的Linux/Unix上的文件權限
簡而言之,我想從一個只能在Linux上運行的.net核心應用程序中chmod一個文件644,但在如何繼續下去的時候感到茫然。
謝謝。
我想學習如何使用.NET核心在Linux/Unix上設置文件權限。我已經在這裏發現了一個問題,指向System.IO.FileSystem的方向,但我似乎找不到有關如何使用它的任何文檔。使用.NET核心的Linux/Unix上的文件權限
簡而言之,我想從一個只能在Linux上運行的.net核心應用程序中chmod一個文件644,但在如何繼續下去的時候感到茫然。
謝謝。
目前,.NET Core中沒有內置的API。但是,.NET Core團隊正致力於在.NET Core上提供Mono.Posix
。這暴露了API在託管代碼中執行這種操作。見https://github.com/dotnet/corefx/issues/15289和https://github.com/dotnet/corefx/issues/3186。您可以嘗試在這裏這個API的早期版本:https://www.nuget.org/packages/Mono.Posix.NETStandard/1.0.0-beta1
var unixFileInfo = new Mono.Unix.UnixFileInfo("test.txt");
// set file permission to 644
unixFileInfo.FileAccessPermissions =
FileAccessPermissions.UserRead | FileAccessPermissions.UserWrite
| FileAccessPermissions.GroupRead
| FileAccessPermissions.OtherRead;
如果你不想使用Mono.Posix,您可以通過調用本機代碼實現相同的功能。使用P/Invoke,可以從libc
調用chmod
函數。有關本機API的更多詳細信息,請參閱man 2 chmod
。
using System;
using System.IO;
using System.Runtime.InteropServices;
using static System.Console;
class Program
{
[DllImport("libc", SetLastError = true)]
private static extern int chmod(string pathname, int mode);
// user permissions
const int S_IRUSR = 0x100;
const int S_IWUSR = 0x80;
const int S_IXUSR = 0x40;
// group permission
const int S_IRGRP = 0x20;
const int S_IWGRP = 0x10;
const int S_IXGRP = 0x8;
// other permissions
const int S_IROTH = 0x4;
const int S_IWOTH = 0x2;
const int S_IXOTH = 0x1;
static void Main(string[] args)
{
WriteLine("Setting permissions to 0755 on test.sh");
const int _0755 =
S_IRUSR | S_IXUSR | S_IWUSR
| S_IRGRP | S_IXGRP
| S_IROTH | S_IXOTH;
WriteLine("Result = " + chmod(Path.GetFullPath("test.sh"), (int)_0755));
WriteLine("Setting permissions to 0644 on sample.txt");
const int _0644 =
S_IRUSR | S_IWUSR
| S_IRGRP
| S_IROTH;
WriteLine("Result = " + chmod(Path.GetFullPath("sample.txt"), _0644));
WriteLine("Setting permissions to 0600 on secret.txt");
const int _0600 = S_IRUSR | S_IWUSR;
WriteLine("Result = " + chmod(Path.GetFullPath("secret.txt"), _0600));
}
}
我由剛開始一個新的進程和執行的bash命令chmod
解決了這個問題。
實施例:
public static void Exec(string cmd)
{
var escapedArgs = cmd.Replace("\"", "\\\"");
var process = new Process
{
StartInfo = new ProcessStartInfo
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "/bin/bash",
Arguments = $"-c \"{escapedArgs}\""
}
};
process.Start();
process.WaitForExit();
}
然後:
Exec("chmod 644 /path/to/file.txt");
還可以使用此Exec
方法運行的任何其它類型的bash命令。
Microsoft在Windows上使用其文件權限模型並將其轉換爲Linux/UNIX。所以對'chmod'的調用是內部的,https://github.com/dotnet/corefx/blob/bffef76f6af208e2042a2f27bc081ee908bb390b/src/Common/src/Interop/Unix/System.Native/Interop.ChMod.cs並且僅用於https://github.com/dotnet/corefx/blob/801dde95a5eac06140d0ac633ac3f9bfdd25aca5/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Unix.cs所以你的情況,你必須翻譯644到相應的Windows文件權限然後使用Windows方式來操作文件。 –