Ответ 1
Возможно, я ошибаюсь, но... Я думаю, что атрибут X означает, что файл имеет расширенные атрибуты. К сожалению, расширенные атрибуты не могут быть изменены с помощью С#.
У меня есть скрытый файл на моем USB-съемном носителе (файловая система FAT).
Я использую Windows 7. Если я перейду в окно свойств этого файла, а затем на вкладку "Сведения", я увижу, что атрибуты файла HX
. Когда я запускаю cmd
и использую attrib
, мне сказали, что у файла есть атрибут H. Ничего о X. Я пробовал help attrib
, но все же ничего не сказал об атрибуте X.
Я знаю, что:
Однако я понятия не имею, что означает X. Я также нашел, что для атрибуты N и E предназначены для.
Wikipedia не упоминает, что такое атрибут X.
Google обнаружил две темы, в которых упоминается атрибут X:
Ничего из этого не помогло.
Я хотел бы иметь возможность читать/писать этот флаг в С#, но до сих пор я читал документацию для FileAttributes
enumeration и экспериментировал с установкой некоторых из перечисленных атрибутов (используя File.GetAttributes
и File.SetAttributes
методы) в файле.
Ни один из этих экспериментов не привел к появлению атрибута X в свойствах → Детали. Итак, я понятия не имею, как подойти к нему, тем более, что я до сих пор не знаю, что означает атрибут X.
Итак, что такое атрибут X и как его можно установить/очистить в выбранном файле на С#?
Возможно, я ошибаюсь, но... Я думаю, что атрибут X означает, что файл имеет расширенные атрибуты. К сожалению, расширенные атрибуты не могут быть изменены с помощью С#.
К сожалению, Windows API не позволит вам установить/отключить FILE_ATTRIBUTE_DEVICE, потому что он не предназначен для установки в файлах. Если вам действительно нужна возможность сделать это, вам придется напрямую обращаться к диску. Я не рекомендую делать это на С#.
Самая быстрая реализация, вероятно, заключалась бы в том, чтобы забыть об этом в Windows, загрузить источник mtools и сделать пару исправлений к источнику матраца, чтобы заставить его работать.
Например, добавьте в msdos.h:
#define ATTR_DEVICE 0x40
#define IS_DEVICE(entry) (HAS_BIT((entry),ATTR_DEVICE))
Затем добавьте код в mattr.c, чтобы вы могли установить атрибут и проверить изменение:
static int view_attrib(direntry_t *entry, MainParam_t *mp)
{
...
/* Add this if block */
if(IS_DEVICE(entry))
putchar('X');
...
}
static int concise_view_attrib(direntry_t *entry, MainParam_t *mp)
{
...
/* Add the following if block */
if(IS_DEVICE(entry))
putchar('X');
...
}
static int letterToCode(int letter)
{
switch (toupper(letter)) {
...
/* Add the following case */
case 'X':
return ATTR_DEVICE;
...
}
}
Тогда вам просто нужно настроить диск на mtools и вызвать новую созданную команду mattrib -x в файле, который вы хотите изменить.
Атрибут файла 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 - если бы это даже работало).
X, скорее всего, разрешает выполнение. icalcs
упоминает об этом, и вы можете использовать эту команду из С# для установки атрибута файла, хотя я не уверен, будет ли он работать с файловой системой FAT или нет.
Я не могу воспроизвести вашу проблему, но в качестве обходного пути для удаления этого атрибута, я думаю, вы можете попробовать с robocopy:
robocopy xattributefile copyoffile /copy:DT
/copy:DT
: Указывает свойства файла, которые нужно скопировать.
Это не должно копировать атрибут, но я не знаю, работает ли он с атрибутом X)