Атрибут файла X
соответствует System.IO.FileAttributes.Device
, который имеет целочисленное значение 64
(0x40), используя .NET, вы не можете напрямую установить это значение. Проблема в том, что когда вы вызываете File.SetAttributes(path, fileAttributes)
, он вызывает внутреннюю функцию импорта DLL в Mscorlib.dll
, а именно статический метод Microsoft.Win32.Win32Native.SetFileAttributes
, это прямой импорт DLL kernel32.dll
и определяется как:
// Microsoft.Win32.Win32Native
[DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool SetFileAttributes(string name, int attr);
Проще говоря, даже используя kernel32.dll
, вы не можете установить это значение. См .: SetFileAttributes и System.IO.FileAttributes .
Но вы можете написать код, который будет эффективно выполнять те же действия, что и установка или удаление этого атрибута.
Ваш лучший и наиболее вероятный (разумный) ответ - сохранить файл шаблона с разрешением X
, когда вам нужно задать для файла X
, вы переименуете существующий файл, скопируйте шаблон X
файл, а затем запишите другие атрибуты.
Для удаления разрешения X
вы должны прочитать файл и записать в новый файл, а затем скопировать туда разрешения, используя простой вызов File.SetAttributes(path, File.GetAttributes(oldPath));
(который не установит разрешение X
.
Этот подход довольно прост и вполне возможен в нативном .NET (и на самом деле он тоже не будет выглядеть слишком противным, по сравнению со взломом на уровне диска или вызовом cgywin - если это будет даже работать).