Как установить очистить атрибут "X" для файлов с в C #? - PullRequest
24 голосов
/ 23 декабря 2011

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

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

Я знаю, что:

  • H = Скрытый
  • S = Система
  • A = Архив
  • R = Только чтение

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

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

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

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

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

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

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

Ответы [ 5 ]

1 голос
/ 14 ноября 2013

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

1 голос
/ 21 октября 2012

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

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

1 голос
/ 23 декабря 2011

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

0 голосов
/ 12 ноября 2013

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

robocopy xattributefile copyoffile /copy:DT

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

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

0 голосов
/ 23 декабря 2011

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

...