2010-02-23 11 views
32

Wie kann ich das Attribut readonly programmatisch aus einem Verzeichnis in C# entfernen?Entfernen Sie das Attribut readonly aus dem Verzeichnis

+0

@Lalit Was möchten Sie erreichen? –

+0

siehe Ich habe nur Ordner auf meinem Pfad gelesen. Ich möchte einige Dateien in diesem Ordner kopieren. so dass sie temporär schreibbar machen wollen, heißt readonly entfernen, dann kopieren sie die dateien dann wieder als leser. kannst du mir helfen? Dies ist Voraussetzung. –

+0

Unter Windows ist das Attribut readonly in einem Verzeichnis tatsächlich ziemlich bedeutungslos. Sie können das Verzeichnis immer noch löschen, umbenennen usw. Siehe 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-oder-in-Windows-7 für weitere Informationen. –

Antwort

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

hey darin, was bedeutet diese Syntax? "& = ~" Prost! – andy

+27

& = -> Append also nicht alle anderen Attribute berühren und ~ -> ergänzen also das Gegenteil von readonly – MarkKGreenway

5

Hier ist eine gute Verbindung zu den Beispielen der Datei ändern Attribute C#

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

basierend auf ihrem Beispiel verwenden, können Sie das Lesen entfernen Nur wie dieses Attribut (ich dies nicht getestet):

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

kommen Sie auf alles über Datei. wana abt Verzeichnis .... bitte. –

+1

@Red Swan: Ich habe gerade dies getestet, um versteckte Attribute hinzuzufügen, und es funktioniert auch gut mit Verzeichnissen. – Petrucio

+1

Dies funktioniert für Dateien und Verzeichnisse, da ein Verzeichnis wie eine spezielle Datei mit dem Verzeichnisattribut (FileAttributes.Directory) ist. – seveves

2

Wenn Sie versuchen, das Attribut einer Datei im Dateisystem zu entfernen, erstellen Sie eine Instanz der System.IO.FileInfo-Klasse, und legen Sie die Eigenschaft IsReadOnly auf false fest.

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

Nein nicht über die Datei. Ich möchte von Directory/Folder –

0

Got es endlich. ;)

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

die Verwendung von - = Zuweisungsoperator ist aus zwei Gründen gefährlich: 1) Es funktioniert nur, wenn die Readonly-Attribut gesetzt, damit ein Test im Voraus erforderlich ist. 2) Es führt eine Subtraktionsoperation durch, die nicht die beste Wahl ist, wenn mit binären Flags gearbeitet wird. Die Subtraktionsoperation funktioniert, wenn die Bedingung 1 (oben) wahr ist. Zusätzliche Subtraktionsoperationen ändern jedoch ANDERE BITS im Feld FileAttributes!

Verwenden Sie "& = ~ FileAttributes.ReadOnly;" ReadOnly-Flag zurücksetzen.

Verwenden Sie "| = FileAttributes.ReadOnly;" um das ReadOnly-Flag zu setzen.

0

Einstellung Attribute zu FileAttributes.Normal arbeitete für mich auf beiden Ordner und Dateien.

+0

Die einzige Sorge, die ich mit diesem Ansatz habe, ist, was ist, wenn der Ordner (oder die Datei) ein anderes Attribut hat? Wenn ein Ordner nur versteckt und schreibgeschützt ist und Sie ihn nur noch nicht mehr lesen lassen möchten, wird er von Ihrer Methode nicht mehr ausgeblendet. Das könnte unbeabsichtigte Konsequenzen haben. –

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); 
    }