2016-09-03 20 views
1

ich den folgenden Code haben einen Ordner für Dateien vorzubereiten ich generieren:Ist Directory.CreateDirectory asynchron oder was?

if (Directory.Exists(outputDir)) 
{ 
    Directory.Delete(outputDir, true); 
} 
Directory.CreateDirectory(outputDir); 

Wenn ich es normal laufen, genau jedes zweite Mal es funktioniert, und das andere Mal wirft er einen DirectoryNotFoundException, auf der Linie:

File.WriteAllLines(filePath, CreateRows(TestLineCount, TestSampleCount)); 

sagen Could not find a part of the path 'C:\Dev\Android\Projects.... Der letzte Ordner in der filePath fehlt, weil ich ihn gelöscht habe, aber dann habe ich ihn neu erstellt, damit er immer da sein sollte. Wenn ich einen Breakpoint auf die Linie Directory.CreateDirectory(outputDir); setze und es eine kleine Verzögerung gibt, funktioniert die App jedes Mal. Wenn ich eine automatische Verzögerung einschließe, d. H.

Es funktioniert auch jedes Mal. Sicherlich sollten alle diese Anrufe blockieren bis zum Ende, so dass die outputDir immer da ist?

+1

Können Sie umfassen die vollständige Stacktrace weil Create einen Scheck hat, kurz bevor es den Ordner zu überprüfen, zurückgibt, erstellt und wenn nicht wirft. Also frage ich mich, wo in der FileStream.Init es fehlschlägt, angenommen, dass die Methode an der Spitze der Aufrufliste ist. Auf welchem ​​OS ist das übrigens? – rene

+0

Bitte geben Sie den Code ein, der das Problem und die vollständige Ausnahme einschließlich der Aufrufliste tatsächlich reproduziert. Sie können es mit 'Exception.ToString()' bekommen. 'CreateDirectory' ist nicht asynchron. Arbeiten Sie vielleicht mit Remote-Freigaben? –

Antwort

0

Ich denke, dass es nicht asynchron ist, aber wenn man das nennen, wie die

Directory.CreateDirectory(outputDir); //App is trying to create directory 
//successfully created but depends on OS how fast OS commits the changes 

Thread.Sleep(500); //assuming physically creation on Hard and its availability in OS took less then 500ms then this wait works or else we have to wait more 

//this delay is actually totally non generic since the time differs OS to OS 


// its just a rough guess that changes will be committed within 500ms 

if(!Directory.Exists(outputDir)) 
    //if still not exists Your OS que is being processed very slow due to 
    //some not known reason! so you have to wait more then 500ms 
+0

Dann ist das eigentlich ein Fehler. Es 'CreateDirectory' sollte erst zurückkommen, wenn die Änderungen festgeschrieben sind. Ich würde das nur von 'CreateDirectoryAsync' erwarten. – ProfK

+0

@ProfK Wo haben Sie 'CreateDirectoryAsync' gefunden? Ich habe gehört, dass es in WinRT verfügbar war, aber Googeln für es gibt irrelevante Ergebnisse zurück. Anyway, CreateDirectory ist nicht asynchron. Veröffentlichen Sie die vollständige Ausnahme (einschließlich der Aufrufliste) und den Code, der das Problem reproduziert. –

+0

@PanagiotisKanavos Ich habe 'CreateDirectoryAsync' nicht gefunden. Ich sagte, das Blockieren von 'CreateDirectory' verhält sich so, als wäre es asynchron. – ProfK

Verwandte Themen