2013-02-19 11 views
5

Ho codice seguente in una funzione chiamata Page_Load. Quando la pagina viene caricata per la prima volta dopo l'avvio di Visual Studio, tutto funziona correttamente.
Ma qualsiasi altra chiamata apertura al file dopo che restituisce IOException: "File is in use by another process", anche quando si apre direttamente il file in VisualStudio Soluzione Questo errore viene restituito (ovviamente non come eccezione)FileStream.close() non rilascia file per altri processi

FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open); 
PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream); 
//Do some stuff with the file 
mailinglist_FileStream.Close(); 
mailinglist_Reader.Close(); 
mailinglist_Reader.Dispose(); 
mailinglist_FileStream.Dispose(); 

Perché il file ancora bloccato? e perché il riavvio completo di Visual Studio ripristina il file? durante il controllo di file-Properties si dice:

Corporatura Azione: Content
Copia directory di output: non copiare

sto solo leggendo questo file. posso fare qualcosa di simile a adLockOptimistic, in modo che più processi possano accedere al file?

+2

Nota: utilizzare l'istruzione using invece di chiudere e smaltire gli oggetti manualmente –

risposta

7

Perché il file è ancora bloccato? e perché il riavvio completo di Visual Studio ripristina il file? quando si controlla il file -Proprietà dice [...] Non so perché il file è ancora bloccato: probabilmente perché il tuo codice fallisce prima che il flusso venga chiuso/eliminato.

Chi "perché completamente il riavvio di Visual Studio [...]": perché si può essere utilizza IIS Express o ASP.NET Dev Server di cui sono chiusi quando si chiude l'IDE, in modo da blocchi sui file vengono rilasciati dal momento che il processo di blocco non è più in esecuzione.

E su "perché è il file ancora bloccato? [...]" potrebbe essere perché il flusso di file non è chiusa, perché a volte il filo non può terminare con successo e le serrature non vengono rilasciati.

Come altra risposta, ha detto, verificare come using blocco può evitare che IDisposable oggetti non sarebbero stati smaltiti:

// FileShare.ReadWrite will allow other processes 
// to read and write the target file even if other processes 
// are working with the same file 
using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite)) 
using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream)) 
{ 
     // Do your stuff. Using blocks will call Dispose() for 
     // you even if something goes wrong, as it's equal to a try/finally! 
     // Also check how using statements can be chained without extra { }   
} 

sto solo leggendo questo file. posso fare qualcosa di simile a adLockOptimistic, in modo che più processi possano accedere al File?

Sì, dare un'occhiata a File.Open metodo e FileShare enumerazione:

+1

+1 sull'enumerazione FileShare – jessehouwing

+0

@Matias Per quanto riguarda il commento delle parentesi: "senza extra {}" è una preferenza personale per l'utilizzo della sintassi del linguaggio. Un blocco a singola istruzione non richiede l'inserimento di parentesi graffe. E FileShare.ReadWrite consentirà ad altri processi di accedere al file, ma non risolve il problema del file che rimane aperto. Bel esempio e buoni punti, però. – Suncat2000

0

Provare a utilizzare i blocchi using, potrebbe non risolvere il problema di blocco, ma è la forma migliore per gli oggetti monouso.

using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open)) 
{ 
    using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream)) 
    { 
     ...    
    } 
} 

Inoltre, provare a chiudere mailinglist_Reader prima mailinglist_FileStream.

+0

la cosa divertente è, dopo aver cambiato l'ordine, il Page_Load funziona, ma il mio catch (IOException) BLock viene ancora eseguito – Vogel612

+1

Call of' Stream.Close 'nell'uso del blocco è ridondante. –

+0

Quale eccezione stai ricevendo, la stessa? Prova a commentare le due linee 'Close();' come sono probabilmente chiamate da 'using'. –

1

Imparate come utilizzare using:

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read)) 
{ 
    ... 
} 

Il costrutto using assicura che il file venga chiuso quando si abbandona il blocco anche se viene generata un'eccezione.

Il tuo problema potrebbe non essere qui, ma da qualche altra parte nel tuo codice. Dovrai esaminare tutto il codice e cercare i luoghi in cui hai aperto i file ma non metterli in una dichiarazione using.

Problemi correlati