Как дать права на запуск файла как программы C#?

Представим что в каталоге /home/ketronix есть файл ao.desktop, задача - дать этому файлу права на запуск. Сделать это нужно через код. В терминале это делается командой chmod, можно ли такое провернуть через код, не выполняя команду chmod? Так то можно просто выполнить системную утилиту с передачей ей аргумента в виде файла, но мне интересно можно ли это как-то по другому сделать?


Ответы (1 шт):

Автор решения: Pak Uula

Вам нужно установить пакет 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

→ Ссылка