Directory.CreateDirectory-Latenzproblem?

8

Ich versuche ein Remote-Verzeichnis zu erstellen und schreibe dann eine Datei dorthin. Hin und wieder fällt die Anwendung mit einer System.IO.DirectoryNotFoundException aus, während sie versucht, die Datei zu schreiben.

Wenn ich die Datei schreibe, verwende ich das zurückgegebene DirectoryInfo-Objekt, um den Dateipfad zu erstellen, sodass die Anwendung zu denken scheint, dass das Verzeichnis erstellt wurde. Das Verzeichnis existiert jedoch nicht.

Gibt es eine Chance, dass ich versuche, in das Verzeichnis zu schreiben, bevor Windows es erstellt hat? Ich würde denken, dass das Directory.CreateDirectory nicht zurückkommen würde, bis diese Aufgabe beendet wurde.

    
majorpayne27 08.02.2010, 23:09
quelle

3 Antworten

7

Antwort - Ja. Das Verhalten, wenn die Erstellung von Dateien / Verzeichnissen verzögert wird, wird erwartet. Gewöhnliche Lösung, wie von anderen Kommentatoren vorgeschlagen, besteht darin, Wiederholungen mit einer gewissen Zeitüberschreitung zu verwenden. Das Verhalten ist das gleiche was auch immer Dateifunktionen verwendet werden: Findfirst, CreateFile, WaitForSingleObject etc.

Eine andere Lösung wird sein, neue Transaktionsfunktionen der API zu verwenden, die auf Vista und späteren Windows-Betriebssystemen zu finden sind.

Das Problem ist unangenehm und wurde von Entwicklern von dateiintensiven Projekten, die auf anderen Plattformen erstellt und nach Windows verschoben wurden, nie verstanden: wie DOS / CMD-Skripte, SVN-Clients, Cygwin, Perl, verschiedene Java-Anwendungen, verschiedene Installer etc.

    
user215054 08.02.2010, 23:39
quelle
6

Ich hatte gerade dieses Problem und für mich war die Situation so:

%Vor%

Später, wenn in einer anderen Klasse, an die das selbe DirectoryInfo-Objekt übergeben wurde, mache ich a:

%Vor%

Und das Verzeichnis existiert scheinbar immer noch nicht (obwohl ich das Elternverzeichnis in Windows geöffnet habe und natürlich kann ich es direkt vor mir sehen).

Die Lösung, die ich gefunden habe, ist nach der ersten Erstellung des Verzeichnisses, das ich aufrufen sollte:

%Vor%

Von Microsoft:

  

Aktualisiert den Zustand des Objekts. (Von FileSystemInfo geerbt.)

    
Mike Cheel 06.02.2015 20:53
quelle
4

Obwohl ich dieses Verhalten noch nie erlebt habe und es nicht erklären kann, besteht eine pragmatische Lösung darin, eine Schleife um Ihren Anruf einzurichten, der auf das Verzeichnis zugreift. Fangen Sie DirectoryNotFoundException in dieser Schleife ein und versuchen Sie jedes Mal nach einer kurzen Pause den Zugriff erneut. Wiederholen Sie die Ausnahme, wenn die Wiederholungsanzahl überschritten wird.

Wenn Sie zu diesem Zeitpunkt eine detaillierte Protokollierung hinzufügen, können Sie die tatsächliche Ursache des Problems ermitteln.

    
Eric J. 08.02.2010 23:21
quelle