Как установить четкий атрибут X в файлах на С#?

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

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

Я знаю это:

  • Н = скрыто
  • С = Система
  • А = Архивный
  • R = Только для чтения

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

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

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

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

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

Ни один из этих экспериментов не привел к отображению атрибута X в «Свойства» -> «Подробности». Итак, я понятия не имею, как к этому подойти, тем более что я до сих пор не знаю, что означает атрибут X.

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


person beam022    schedule 23.12.2011    source источник
comment
Кажется, все комментарии пропали - меня спросили, исчезнет ли атрибут X после выполнения chkdsk. Нет, я сделал chkdsk - проблем не обнаружено и атрибут X остался.   -  person beam022    schedule 23.12.2011
comment
Я бы предположил намеренно недопустимый атрибут файла. В FAT32 есть два неназначенных бита, 0x40 и 0x80. Это всего лишь предположение.   -  person Hans Passant    schedule 23.12.2011
comment
Я подозреваю, что Ганс прав. Получите атрибуты файла, приведите его к int и выведите в шестнадцатеричном формате. Затем сравните установленные биты с константами атрибутов файла: msdn.microsoft.com/en-us/library/windows/desktop/. Это должно сказать вам, какой бит установлен неправильно. Если вы хотите очистить атрибут, очистите его в этом int, верните int обратно в FileAttributes и вызовите File.SetAttributes.   -  person Jim Mischel    schedule 24.12.2011
comment
Я последовал совету Джима (спасибо за пошаговые инструкции) и сначала попытался получить и установить атрибуты для фиктивного файла. Получил 0x20 (файл архива), потом поставил 0x22 и пустышка скрылась. Пытался получить атрибуты рассматриваемого файла - получил 0x42 (устройство+скрыто). Пытался установить его на 0x2 (просто скрытый), но меня остановил отказ в доступе. Затем я попытался установить атрибуты манекена на 0x42. Никаких проблем, однако, когда я проверяю вкладку «Подробности» манекена, это единственный атрибут H. И если я сейчас получу атрибуты пустышки, то просто 0x2. 0x40 Зарезервировано; не используйте. Любым другим путем?   -  person beam022    schedule 24.12.2011
comment
См. функция SetFileAttributes, раздел Примечания. Я знаю, что означает не использовать, но этот файл установил атрибут 0x40 другой программой, я хотел бы иметь возможность сделать то же самое. Или чтобы отключить.   -  person beam022    schedule 24.12.2011
comment
Обновление: это может помочь.   -  person beam022    schedule 24.10.2012
comment
Я не уверен, что вам нужно делать это в Windows. Если нет, то мой ответ может помочь.   -  person Kevin Stricker    schedule 26.10.2012
comment
@mootinator, делающий это в Windows, для меня обязателен.   -  person beam022    schedule 05.03.2013


Ответы (5)


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

person CedX    schedule 23.12.2011
comment
Я думаю, вы можете быть правы насчет расширенных атрибутов. Теперь я знаю, что FILE_ATTRIBUTE_DEVICE 0x40 нельзя установить с помощью SetFileAttribute, но, возможно, есть другой способ установить или очистить этот атрибут с помощью C#. Я читал о EA DATA. SF, но, похоже, мне еще многое предстоит прочитать. Любая идея, как получить доступ и отредактировать файл EA DATA. SF из С#? Реализация советника на FAT, EA - что и как - person beam022; 24.12.2011
comment
Я попробовал несколько инструментов для удаления файлов, доступных там, но ни один из них не помог избавиться от файла. Что касается EA DATA. SF, я не уверен, что этот файл EA находится на моей флешке. Как проверить его существование? здесь сказано, что EA DATA. SF файл может удаляться только за пределами Windows из-за того, что он используется. Это действительно случай? И если я не могу удалить файл с атрибутом X из-за EA DATA. SF, который я тоже не могу удалить из-за win7... Как мне сделать свой EA DATA. SF после форматирования флешки? - person beam022; 24.12.2011
comment
Причина, по которой я спросил, как проверить наличие файла EA DATA. SF, заключалась в том, что он не отображается в проводнике (я включил отображение скрытых и системных файлов). Я пробовал if exist "EA DATA. SF" echo It's here! в cmd, но не получил подтверждения. Похоже, это не файл EA DATA. SF, делающий другой файл неприкосновенным. Могу ошибаться, буду признателен за помощь. - person beam022; 28.12.2011

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

person Seph    schedule 14.11.2013

К сожалению, Windows API не позволит вам установить/удалить FILE_ATTRIBUTE_DEVICE, потому что он не предназначен для установки в файлах. Если вам действительно нужна возможность сделать это, вам потребуется прямой доступ к диску. Я действительно не рекомендую пытаться сделать это на С#.

Самая быстрая возможная реализация, вероятно, состоит в том, чтобы забыть об этом в Windows, загрузить исходный код для mtools и внесите пару правок в исходный код mattrib, чтобы он заработал.

например добавить в 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 для файла, который вы хотите изменить.

person Kevin Stricker    schedule 21.10.2012
comment
Спасибо за ваш ответ, однако мне нужно сделать это в Windows. - person beam022; 05.03.2013
comment
Ах. Конечно, вы действительно можете заставить этот код работать под Cygwin, если вы все еще застряли. - person Kevin Stricker; 05.03.2013

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

person neouser99    schedule 23.12.2011
comment
Я не думаю, что атрибут выполнения применим к файловой системе Windows, такой как FAT. - person CedX; 23.12.2011
comment
Я читал о icacls, пытался использовать его в рассматриваемом файле, получил отказ в доступе. Затем я немного поэкспериментировал с icacls на других файлах на USB-накопителе, но далеко не продвинулся: когда я набрал icacls dummy, все, что я получил, это dummy D:NO_ACCESS_CONTROL. Я не мог внести какие-либо изменения в ACL манекена, хотя пробовал /grant, /deny и /remove. Затем я провел поиск и обнаружил, что ACL сначала поддерживаются файловой системой ntfs в соответствии с сообщение andreas2610 - person beam022; 24.12.2011