2010-02-23 2 views
32

Как я могу программно удалить атрибут readonly из каталога на C#?Удалить атрибут readonly из каталога

+0

@Lalit Чего вы пытаетесь достичь? –

+0

см. У меня есть только папка для чтения на моем пути. Я хочу скопировать некоторые файлы в эту папку. так что хотите временно сделать его доступным для записи, значит удалить readonly, а затем скопировать файлы, а затем снова сделать этот фокус как только для чтения. Могу ли я помочь мне? Это требование. –

+0

В Windows наличие атрибута readonly, установленного в каталоге, на самом деле довольно бессмысленно. Вы все равно можете удалить, переименовать и т. Д. Этот каталог. См. Https://support.microsoft.com/en-us/help/326549/you-cannot-view-or-change-the-read-only-or-the-system-attributes-of-folders-in-windows -server-2003, -in-windows-xp, -in-windows-vista-or-in-windows-7 для получения дополнительной информации. –

ответ

73
var di = new DirectoryInfo("SomeFolder"); 
di.Attributes &= ~FileAttributes.ReadOnly; 
+3

эй дарин, что означает этот синтаксис? «& = ~» приветствует! – andy

+27

& = -> Добавить так, чтобы не касаться всех других атрибутов и ~ -> дополнять, так что делайте противоположное readonly – MarkKGreenway

5

Вот хорошая ссылка на примеры изменения файла атрибутов с использованием C#

http://www.csharp-examples.net/file-attributes/

основана на их примере можно удалить только чтение атрибутов, как это (я не проверял это):

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

Приходите на все это о файле. wana abt Directory .... пожалуйста. –

+1

@Red Swan: Я просто проверил это, чтобы добавить скрытые атрибуты, и он отлично работает с каталогами. – Petrucio

+1

Это работает для файлов и каталогов, потому что каталог похож на специальный файл с установленным атрибутом каталога (FileAttributes.Directory). – seveves

2

Если вы пытаетесь удалить атрибут файла в файловой системе, создайте экземпляр класса System.IO.FileInfo и установите для свойства IsReadOnly значение false.

 FileInfo file = new FileInfo("c:\\microsoft.text"); 
     file.IsReadOnly = false; 
+0

нет нет о файле. Я хочу, чтобы каталог/папка –

0

Понял, наконец. ;)

class Program 
{ 
    static void Main(string[] args) 
    { 
     DirectoryInfo di = new DirectoryInfo("c:\\test"); 

     FileAttributes f = di.Attributes; 

     Console.WriteLine("Directory c:\\test has attributes:"); 
     DecipherAttributes(f); 

    } 

    public static void DecipherAttributes(FileAttributes f) 
    { 
     // To set use File.SetAttributes 

     File.SetAttributes(@"C:\test", FileAttributes.ReadOnly); 

     if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      Console.WriteLine("ReadOnly"); 

     // To remove readonly use "-=" 
     f -= FileAttributes.ReadOnly; 

     if ((f & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
      Console.WriteLine("ReadOnly"); 
     else 
      Console.WriteLine("Not ReadOnly"); 
    } 
} 
3

Использование - оператор присваивания = опасно по двум причинам: 1) Это работает только если ReadOnly атрибут установлен, таким образом, испытание необходимо заранее. 2) Выполняет операцию вычитания, что не является лучшим выбором при работе с бинарными флагами. Операция вычитания работает, если условие 1 (выше) истинно, но дополнительные операции вычитания будут ALTER OTHER BITS в поле FileAttributes!

Использовать «& = ~ FileAttributes.ReadOnly;» сбросить флаг ReadOnly.

Используйте «| = FileAttributes.ReadOnly;» установить флаг ReadOnly.

0

Установка атрибутов в FileAttributes.Normal работал для меня на обоих папки и файлов.

+0

Единственное беспокойство, которое я испытываю при таком подходе, - это то, что если папка (или файл) имеет другой атрибут? Если папка скрыта и доступна только для чтения, и вы хотите сделать ее более неточным, ваш метод заставит ее больше не скрываться. Это может иметь непреднамеренные последствия. –

0
public static void DeleteDirectory(string path) 
    { 
     var directory = new DirectoryInfo(path) 
     { Attributes =FileAttributes.Normal }; 
     foreach (var info in directory.GetFileSystemInfos("*", SearchOption.AllDirectories)) 
     { 
      info.Attributes = FileAttributes.Normal; 
     } 
     directory.Delete(true); 
    } 
Смежные вопросы