Лучший способ сделать файл доступным для записи в С#

Я пытаюсь установить флаг, который вызывает появление флажка Read Only, когда вы right click \ Properties в файле.

Спасибо!


person will    schedule 29.07.2009    source источник
comment
Вы пытаетесь сделать файл доступным только для чтения в соответствии с вашим вопросом или доступным для записи (не только для чтения) в соответствии с заголовком вашего вопроса?   -  person Lasse V. Karlsen    schedule 29.07.2009
comment
Это сложная проблема для операционных систем на базе Win2k. Есть атрибут только для чтения, который вы можете дать файлу, а также есть разрешение на запись, которое предоставляется на вкладке «Разрешения». Первое — это всего лишь предложение, тогда как второе фактически применяется операционной системой.   -  person Armentage    schedule 29.07.2009
comment
@Armentage Я не думаю, что это так уж сложно. Существует четкое различие между файловыми флагами и наборами разрешений NTFS, и этот вопрос явно относится к первому случаю.   -  person Rex M    schedule 30.07.2009


Ответы (2)


Два пути:

System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
fileInfo.IsReadOnly = true/false;

or

// Careful! This will clear other file flags e.g. `FileAttributes.Hidden`
File.SetAttributes(filePath, FileAttributes.ReadOnly/FileAttributes.Normal);

Свойство IsReadOnly в FileInfo, по сути, выполняет переключение битов, которое вам пришлось бы выполнять вручную во втором методе.

person Rex M    schedule 29.07.2009
comment
Удивительно, как быстро здесь можно получить ответ. Я люблю этот сайт! - person JimDel; 29.07.2009
comment
Я не знал, что вы можете использовать первый метод. Потрясающий! - person Mike Cole; 29.07.2009
comment
Обратите внимание, что это одновременно удалит другие флаги в том же файле. Скрытый файл станет видимым, системный файл станет несистемным и т.д. - person Lasse V. Karlsen; 31.07.2009
comment
@Lasse второй метод подойдет, если кто-то не понимает, как работают битовые флаги. К счастью, вы уже объяснили это. - person Rex M; 31.07.2009
comment
Первый метод сокращается до new FileInfo(filePath) { IsReadOnly = false };, что очень удобно! - person joneberg; 17.10.2012

Чтобы установить флаг только для чтения, фактически сделав файл недоступным для записи:

File.SetAttributes(filePath,
    File.GetAttributes(filePath) | FileAttributes.ReadOnly);

Чтобы удалить флаг только для чтения, фактически сделав файл доступным для записи:

File.SetAttributes(filePath,
    File.GetAttributes(filePath) & ~FileAttributes.ReadOnly);

Чтобы переключить флаг только для чтения, сделав его противоположным тому, что он есть сейчас:

File.SetAttributes(filePath,
    File.GetAttributes(filePath) ^ FileAttributes.ReadOnly);

Это в основном битмаски в действии. Вы устанавливаете определенный бит, чтобы установить флаг только для чтения, вы очищаете его, чтобы удалить флаг.

Обратите внимание, что приведенный выше код не изменит никакие другие свойства файла. Другими словами, если файл был скрыт до того, как вы выполнили приведенный выше код, он останется скрытым и после этого. Если вы просто установите атрибуты файла на .Normal или .ReadOnly, вы можете потерять другие флаги в процессе.

person Lasse V. Karlsen    schedule 29.07.2009
comment
имхо это лучший метод. - person Kevin; 14.01.2014