422 Stimmen

Verzeichnis kann nicht mit Directory.Delete(path, true) gelöscht werden

Ich verwende .NET 3.5 und versuche, ein Verzeichnis mit rekursiv zu löschen:

Directory.Delete(myPath, true);

Meines Erachtens sollte dies zu einem Fehler führen, wenn Dateien in Gebrauch sind oder ein Problem mit den Zugriffsrechten besteht, aber ansonsten sollten das Verzeichnis und sein gesamter Inhalt gelöscht werden.

Gelegentlich erhalte ich jedoch diese Meldung:

System.IO.IOException: The directory is not empty.
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
    at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
    ...

Ich bin nicht überrascht, dass die Methode manchmal abbricht, aber ich bin überrascht, dass ich diese spezielle Meldung erhalte, wenn rekursiv wahr ist (ich wissen das Verzeichnis ist nicht leer.)

Gibt es einen Grund, warum ich dies anstelle von AccessViolationException sehen würde?

1voto

David Alpert Punkte 3161

Es scheint, dass der Pfad oder Unterordner in Windows Explorer ausgewählt ist genug, um eine einzelne Ausführung von Directory.Delete(path, true) zu blockieren, werfen eine IOException wie oben beschrieben und sterben, anstatt Windows Explorer zu einem übergeordneten Ordner zu booten und wie erwartet zu verfahren.

1voto

Vilx- Punkte 100739

Das Verzeichnis oder eine Datei darin ist gesperrt und kann nicht gelöscht werden. Finden Sie den Übeltäter, der das Verzeichnis sperrt, und versuchen Sie, ihn zu beseitigen.

0voto

crowdy Punkte 311

Im Falle von Netzwerkdateien kann Directory.DeleteHelper(recursive:=true) eine IOException verursachen, die durch die Verzögerung beim Löschen der Datei verursacht wird

0voto

Pat Pattillo Punkte 51

Ich löste eine mögliche Instanz des genannten Problems, wenn Methoden asynchron und wie folgt codiert waren:

// delete any existing update content folder for this update
if (await fileHelper.DirectoryExistsAsync(currentUpdateFolderPath))
       await fileHelper.DeleteDirectoryAsync(currentUpdateFolderPath);

Mit diesem:

bool exists = false;                
if (await fileHelper.DirectoryExistsAsync(currentUpdateFolderPath))
    exists = true;

// delete any existing update content folder for this update
if (exists)
    await fileHelper.DeleteDirectoryAsync(currentUpdateFolderPath);

Schlussfolgerung? Es gibt einen asynchronen Aspekt der Beseitigung des Handles zur Überprüfung der Existenz, den Microsoft nicht ansprechen konnte. Es ist, als ob die asynchrone Methode innerhalb einer if-Anweisung die if-Anweisung wie eine using-Anweisung handeln lässt.

0voto

configurator Punkte 39516

Wenn das aktuelle Verzeichnis Ihrer Anwendung (oder einer anderen Anwendung) dasjenige ist, das Sie zu löschen versuchen, handelt es sich nicht um einen Zugriffsverletzungsfehler, aber ein Verzeichnis ist nicht leer. Vergewissern Sie sich, dass es sich nicht um Ihre eigene Anwendung handelt, indem Sie das aktuelle Verzeichnis ändern; stellen Sie außerdem sicher, dass das Verzeichnis nicht in einem anderen Programm geöffnet ist (z. B. Word, Excel, Total Commander usw.). Die meisten Programme wechseln in das Verzeichnis der zuletzt geöffneten Datei, was zu diesem Problem führen würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X