Linux/Unixで.NET Coreを使用してファイルのアクセス許可を設定する方法を学習しようとしています。ここでSystem.IO.FileSystemの方向を示す質問を既に見つけましたが、それを使用する方法に関するドキュメントを見つけることができません。
一言で言えば、Linuxでのみ実行される.netコアアプリケーションからファイル644をchmodしたいのですが、続行する方法がわかりません。
現時点では、.NET Coreにはこのための組み込みAPIはありません。ただし、.NET CoreチームはMono.Posix
は.NET Coreで利用できます。これにより、マネージコードでこの種の操作を行う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を使用すると、chmod
からlibc
関数を呼び出すことができます。見る man 2 chmod
ネイティブAPIの詳細については。
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コマンドを実行することもできます。