Как дать права на запуск файла как программы C#?
Представим что в каталоге /home/ketronix есть файл ao.desktop, задача - дать этому файлу права на запуск. Сделать это нужно через код. В терминале это делается командой chmod, можно ли такое провернуть через код, не выполняя команду chmod? Так то можно просто выполнить системную утилиту с передачей ей аргумента в виде файла, но мне интересно можно ли это как-то по другому сделать?
Ответы (1 шт):
Вам нужно установить пакет Mono.Posix.NETStandard
bash$ dotnet add package Mono.Posix.NETStandard
В этом пакете класс UnixFileInfo предоставляет проперти FileAccessPermissions, инкапсулирующую обращение к системному вызову chmod.
Вот пример программы, которая ставит/снимает флаг UserExecute на файл:
using System;
using Mono.Unix;
namespace Example
{
class Example
{
public static void Main()
{
try
{
string fileName = "test.file";
Console.WriteLine("Triggering 'user executable' flag for file " + fileName);
var ufi = new UnixFileInfo(fileName);
Console.WriteLine("File permissions before: " + ufi.FileAccessPermissions);
if (0 != (ufi.FileAccessPermissions & FileAccessPermissions.UserExecute)) {
ufi.FileAccessPermissions &= ~FileAccessPermissions.UserExecute;
} else {
ufi.FileAccessPermissions |= FileAccessPermissions.UserExecute;
}
ufi.Refresh();
Console.WriteLine("File permissions after: " + ufi.FileAccessPermissions);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}
Пример работы:
bash$ ls -l test.file; dotnet run; ls -l test.file ; dotnet run; ls -l test.file
-rw-rw-r-- 1 user user 0 Jul 29 19:58 test.file
Triggering 'user executable' flag for file test.file
File permissions before: OtherRead, GroupWrite, GroupRead, UserWrite, UserRead
File permissions after: OtherRead, GroupWrite, GroupRead, UserReadWriteExecute
-rwxrw-r-- 1 user user 0 Jul 29 19:58 test.file
Triggering 'user executable' flag for file test.file
File permissions before: OtherRead, GroupWrite, GroupRead, UserReadWriteExecute
File permissions after: OtherRead, GroupWrite, GroupRead, UserWrite, UserRead
-rw-rw-r-- 1 user user 0 Jul 29 19:58 test.file
При первом запуске файл стал исполняемым. При втором запуске перестал быть исполняемым.
Проверено на .NET SDK 6.0