2017-07-16 3 views
5

Ich versuche zu lernen, wie man Dateiberechtigungen unter Linux/Unix mit .NET Core setzt. Ich habe hier bereits eine Frage gefunden, die mich in Richtung System.IO.FileSystem weist, aber ich kann keine Dokumentation darüber finden, wie man sie benutzt.Dateiberechtigungen für Linux/Unix mit .NET Core

Kurz gesagt, ich möchte chmod eine Datei 644 aus einem. Net-Kern-Anwendung, die nur unter Linux läuft, aber bin ratlos, wie Sie vorgehen.

Danke.

+0

Microsoft verwendet ihr Dateiberechtigungsmodell unter Windows und übersetzt es in Linux/UNIX. Der Aufruf von 'chmod' ist also intern, https://github.com/dotnet/corefx/blob/bffef76f6af208e2042a2f27bc081ee908bb390b/src/Common/src/Interop/Unix/System.Native/Interop.ChMod.cs und wird nur in https://github.com/dotnet/corefx/blob/801dde95a5eac06140d0ac633ac3f9bfdd25aca5/src/System.IO.FileSystem/src/System/IO/FileSystemInfo.Unix.cs Also in Ihrem Fall müssen Sie 644 in die entsprechenden Windows-Dateiberechtigungen übersetzen und dann verwenden Sie den Windows-Weg, um die Datei zu manipulieren. –

Antwort

6

Im Moment gibt es keine eingebaute API in .NET Core dafür. Das .NET Core-Team arbeitet jedoch daran, Mono.Posix auf .NET Core verfügbar zu machen. Dies macht API verfügbar, um diese Art von Operation in verwaltetem Code auszuführen. Siehe https://github.com/dotnet/corefx/issues/15289 und https://github.com/dotnet/corefx/issues/3186. Sie können eine frühe Version dieser API versuchen hier: 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; 

Wenn Sie Mono.Posix nicht verwenden möchten, können Sie die gleiche Funktionalität durch den Aufruf nativen Code implementieren können. Mit P/Invoke können Sie die chmod-Funktion von libc aufrufen. Weitere Details zur nativen API finden Sie unter 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)); 
    } 
} 
1

löste ich dieses Problem, indem nur einen neuen Prozess starten und bash chmod Befehle ausführen.

Beispiel:

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(); 
} 

und dann:

Exec("chmod 644 /path/to/file.txt"); 

Sie können auch diese Exec Methode verwenden, jede andere Art von bash Befehle auszuführen.