Wie lösche ich eine schreibgeschützte Datei?

72

Ich habe ein Junk-Verzeichnis, in dem ich Downloads, einmalige Projekte, E-Mail-Entwürfe und andere verschiedene Dinge wegwerfe, die für einige Tage nützlich sein können, aber nicht für immer gespeichert werden müssen. Um zu verhindern, dass dieses Verzeichnis meinen Computer übernimmt, habe ich ein Programm geschrieben, das alle Dateien löscht, die älter als eine bestimmte Anzahl von Tagen sind, und nur zum Spaß einige Statistiken über die Anzahl der gelöschten Dateien und deren Größe protokolliert.

Ich bemerkte, dass einige Projektordner viel länger lebten als sie sollten, also begann ich zu untersuchen. Insbesondere schienen Ordner für Projekte, in denen ich SVN verwendet hatte, zu bleiben. Es stellt sich heraus, dass die schreibgeschützten Dateien in den .svn-Verzeichnissen nicht gelöscht werden. Ich habe gerade einen einfachen Test auf einer schreibgeschützten Datei und entdecken , dass System.IO.File.Deleteund System.IO.FileInfo.Deletenicht eine schreibgeschützte Datei löschen.

Der Schutz von Dateien in diesem bestimmten Verzeichnis ist mir egal. Wenn etwas Wichtiges drin ist, ist es am falschen Ort. Gibt es eine .NET-Klasse, die schreibgeschützte Dateien löschen kann, oder muss ich nach schreibgeschützten Attributen suchen und diese entfernen?

OwenP
quelle
2
Ich habe die akzeptierte Antwort geändert, weil Gulzars Codebeispiel detaillierter ist als das von Tim Stewart. Ich hätte das eigentlich wählen sollen, aber aus irgendeinem Grund mochte ich Tims besser. Menschen sind seltsame Dinge!
OwenP
4
+1 dafür, dass du dir die Zeit genommen hast, die Dinge im Universum ein bisschen besser zu machen. Wenn nur meine Entwickler zurückgehen und unsere eigenen geringfügigen Verstöße korrigieren würden, könnten wir die Remedial Programming-Klassen abbrechen!
Adam Liss

Antworten:

152

Gemäß der Dokumentation von File.Delete müssen Sie das schreibgeschützte Attribut entfernen . Sie können die Attribute der Datei mit File.SetAttributes () festlegen .

using System.IO;

File.SetAttributes(filePath, FileAttributes.Normal);
File.Delete(filePath);
Gulzar Nazim
quelle
Sie erhalten eine Gegenstimme dafür, dass Sie Recht haben, aber Ihre Antwort kam nach Tim Stewarts, der dasselbe sagte.
OwenP
In einigen Fällen müssen Sie möglicherweise auch den Besitz der Datei übernehmen, bevor Sie das schreibgeschützte Flag löschen oder löschen können. Weitere Informationen finden Sie unter stackoverflow.com/questions/12999272 .
Greg Bray
19

Das Äquivalent, wenn Sie zufällig mit einem FileInfoObjekt arbeiten, ist:

file.IsReadOnly = false;
file.Delete();
Neil
quelle
2

Warum müssen Sie überprüfen? Löschen Sie einfach das Nur-Lese-Flag und löschen Sie die Datei.

Adam Liss
quelle
1

Hm, ich denke ich würde es lieber sagen

>del /F *

in eine geplante Aufgabe. Möglicherweise von einer Batchdatei zum Protokollieren von Statistiken umschlossen.

Vermisse ich etwas

mkoeller
quelle
Ja. Er möchte eine Datei löschen, wenn sie in einem bestimmten Alter ist. Nicht alle Dateien in jedem Zeitraum.
DrFloyd5
Er möchte nicht alle Dateien löschen, sondern nur alle Dateien, die älter als eine bestimmte Zeit sind.
Tim Stewart