Подтвердить что ты не робот

Как установить атрибут "X" для файлов с помощью С#?

У меня есть скрытый файл на моем USB-съемном носителе (файловая система FAT).

Я использую Windows 7. Если я перейду в окно свойств этого файла, а затем на вкладку "Сведения", я увижу, что атрибуты файла HX. Когда я запускаю cmd и использую attrib, мне сказали, что у файла есть атрибут H. Ничего о X. Я пробовал help attrib, но все же ничего не сказал об атрибуте X.

Я знаю, что:

  • H = Скрытый
  • S = Система
  • A = Архив
  • R = Readonly

Однако я понятия не имею, что означает X. Я также нашел, что для атрибуты N и E предназначены для.

Wikipedia не упоминает, что такое атрибут X.

Google обнаружил две темы, в которых упоминается атрибут X:

Ничего из этого не помогло.

Я хотел бы иметь возможность читать/писать этот флаг в С#, но до сих пор я читал документацию для FileAttributes enumeration и экспериментировал с установкой некоторых из перечисленных атрибутов (используя File.GetAttributes и File.SetAttributes методы) в файле.

Ни один из этих экспериментов не привел к появлению атрибута X в свойствах → Детали. Итак, я понятия не имею, как подойти к нему, тем более, что я до сих пор не знаю, что означает атрибут X.

Итак, что такое атрибут X и как его можно установить/очистить в выбранном файле на С#?

4b9b3361

Ответ 1

Возможно, я ошибаюсь, но... Я думаю, что атрибут X означает, что файл имеет расширенные атрибуты. К сожалению, расширенные атрибуты не могут быть изменены с помощью С#.

Ответ 2

К сожалению, 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 в файле, который вы хотите изменить.

Ответ 3

Атрибут файла 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 - если бы это даже работало).

Ответ 4

X, скорее всего, разрешает выполнение. icalcs упоминает об этом, и вы можете использовать эту команду из С# для установки атрибута файла, хотя я не уверен, будет ли он работать с файловой системой FAT или нет.

Ответ 5

Я не могу воспроизвести вашу проблему, но в качестве обходного пути для удаления этого атрибута, я думаю, вы можете попробовать с robocopy:

robocopy xattributefile copyoffile /copy:DT

/copy:DT: Указывает свойства файла, которые нужно скопировать.

Это не должно копировать атрибут, но я не знаю, работает ли он с атрибутом X)