2010-02-08 12 views
8

Sto provando a creare una directory remota e quindi scrivere un file su di essa. Ogni grande una volta ogni tanto, l'applicazione ha esito negativo con System.IO.DirectoryNotFoundException durante il tentativo di scrivere il file.Directory.CreateDirectory Latenza Problema?

Quando scrivo il file, sto usando l'oggetto DirectoryInfo restituito per aiutare a creare il percorso del file, quindi l'applicazione sembra pensare che la directory sia stata creata. Tuttavia, la directory non esiste.

C'è qualche possibilità che sto cercando di scrivere nella directory prima che Windows abbia finito di crearlo? Penserei che Directory.CreateDirectory non tornerà fino a quando questa attività è stata completata.

+0

Non ho una buona risposta, ma non si dice cosa sia "remoto". Quindi forse è un caso in cui il server remoto ha creato la cartella sul filesystem locale ma non lo sta ancora restituendo durante la navigazione. Forse un problema di cache (qualsiasi cosa memorizzerebbe effettivamente la struttura del filesystem?). –

+0

Il server remoto è un server Windows o un diverso tipo di server che esegue Samba o simili? – Jacob

+0

È una condivisione IFS su un AS400. L'applicazione è in esecuzione su una casella di Windows, l'accesso alla condivisione IFS con un percorso UNC. – majorpayne27

risposta

7

Risposta - Sì. Il comportamento, quando la creazione di file/directory è in ritardo, è previsto. La soluzione ordinaria proposta da altri commentatori consiste nell'utilizzare i tentativi con un certo timeout. Il comportamento è lo stesso a prescindere dalle funzioni dei file: Findfirst, CreateFile, WaitForSingleObject ecc.

Un'altra soluzione sarà l'uso di nuove funzioni transazionali di API trovate su Vista e versioni successive dei SO Windows.

Il problema è brutto e non è mai stato compreso da sviluppatori di progetti ad alta intensità di lima fatte su altre piattaforme e si è trasferito a Windows: come script DOS/CMD, clienti SVN, Cygwin, Perl, varie applicazioni Java, vari installatori ecc

+1

+1 Lo vediamo sempre, al punto che abbiamo una libreria completa di chiamate IO che sono state sintonizzate sulla nostra configurazione NAS. –

+0

Qualcuno sa quali sono questi altri metodi magici? – Mrchief

4

Anche se non ho mai riscontrato questo comportamento e non riesco a spiegarlo, una soluzione pragmatica consiste nell'impostare un ciclo intorno alla chiamata che accede alla directory. Catch DirectoryNotFoundException all'interno di quel ciclo e riprovare l'accesso alcune volte dopo una breve pausa ogni volta. Risolvi l'eccezione se il conteggio dei tentativi viene superato.

L'aggiunta di una registrazione dettagliata a questo punto può aiutare a determinare la causa effettiva del problema.

+0

Potrebbe essere più efficiente controllare 'Directory.Exists()' piuttosto che catturare l'eccezione a meno che ciò non stia restituendo in modo errato vero e tuttavia l'accesso a esso getta. –

+0

@CoryCharlton: come è più efficiente? Il controllo del filesystem è un ordine di grandezza peggiore rispetto al lancio e al controllo di un'eccezione e, presumibilmente, il filesystem farebbe anche la Directory.Exists() in quel caso comunque. – Arafangion

6

ho appena avuto questo problema e per me la situazione era simile a questo:

if(!exportDirectory.Exists) 
    exportDirectory.Create(); 

Poi, più tardi, quando in un'altra classe che ha questa stessa oggetto DirectoryInfo passato ad esso faccio un:

E la directory apparentemente ancora non esiste (anche se ho la directory genitore aperta in Windows e ovviamente posso vederla proprio davanti a me).

La soluzione che ho trovato è, dopo la creazione iniziale della directory che dovrei chiamando:

exportDirectory.Refresh(); 

Da Microsoft:

rinfresca lo stato dell'oggetto. (Ereditato da FileSystemInfo.)

Problemi correlati