Sì, FileShare.Delete tende a causare questo problema. Utilizzato da qualsiasi programma in esecuzione in background e scansiona i file, gli indicizzatori di file e gli antivirus sono gli esempi più comuni.
FileShare.Delete consente di un altro processo per eliminare il file, anche se il processo in background ha ancora il file aperto e sta leggendo da esso. Questo altro processo sarà ignaro che il file non è effettivamente scomparso, perché tutto sa che il file è stato effettivamente cancellato.
Il problema inizia quando quell'altro processo si basa sul file che viene effettivamente rimosso e fa qualcos'altro. Comunemente attivato creando un nuovo file con lo stesso nome. In particolare un modo molto poco saggio per salvare un file poiché causerà la completa perdita di dati senza un backup quando il salvataggio fallisce, ma questo errore è molto comune.
Ciò non riuscirà perché la voce di directory per il file è ancora presente, non scomparirà fino a quando l'ultimo processo che ha il file aperto non chiude l'handle. Qualsiasi altro processo che tenta di aprire nuovamente il file verrà schiaffeggiato con errore 5, "accesso negato". Compreso quel processo che ha cancellato il file e tenta di ricrearlo.
La soluzione è di utilizzare sempre i salvataggi "transazionali", rinominando il file prima di provare a sovrascriverlo. Disponibile in .NET con File.Replace(), nel file nativo winapi con ReplaceFile(). Inoltre facilmente fatto a mano, il flusso di lavoro è:
- eliminare il file di backup, arrestare se non è riuscito
- rinominare il vecchio file al nome del file di backup, stop se non è riuscita
- scrivere il nuovo file utilizzando il nome del file originale , rinominare il backup del lotto se non è riuscito
- eliminare il file di backup, ignorare il fallimento
Fase 2 assicura che non ci sarà mai alcuna perdita di dati, il file originale rimane intatto se qualcosa va storto. Il passaggio 4 garantisce FileShare.La cancellazione funzionerà come previsto, il file di backup sparirà alla fine quando altri processi chiuderanno i loro punti di manipolazione.
fonte
2013-11-09 13:01:13