2013-07-16 15 views
7

sto facendo quanto segue:È necessario chiudere un file dopo aver chiamato ReadAllText?

if (File.Exists(filePath)) 
{ 
    string base64 = File.ReadAllText(filePath); 
    return new ImageContentDTO 
    { 
     ImageContentGuid = imageContentGuid, 
     Base64Data = base64 
    }; 
} 

Questo funziona perfettamente bene. Quello che voglio chiedere è se ho bisogno di chiudere il file o qualcosa di simile dopo aver letto da esso. E se sì, come?

risposta

17

No, non è necessario chiudere esplicitamente il file, File.ReadAllText si occupa di quello per voi.

The documentation contiene queste informazioni in modo molto esplicito:

Questo metodo apre un file, legge ogni riga del file, e quindi aggiunge ogni riga come un elemento di una stringa. Quindi chiude il file.
[...]
L'handle di file può essere chiuso con questo metodo, anche se vengono sollevate eccezioni.

+0

Rightyho. Grazie mille. – Subby

8

Non è necessario chiudere nulla quando si utilizza File.ReadAllText poiché il lettore di flusso inferiore viene chiuso implicitamente.

MSDN: File.ReadAllText

Apre un file di testo, legge tutte le righe del file, e quindi chiude il file .

Ecco l'implementazione in .NET 4 (ILSpy):

string result; 
using (StreamReader streamReader = new StreamReader(path, encoding)) 
{ 
    result = streamReader.ReadToEnd(); 
} 
return result; 

La dichiarazione using dispone la StreamReader (anche in caso di errore), che chiude anche.

+0

Grazie mille Tim. – Subby

+0

Ho usato ReadAllText ed è un servizio finestra così la prima volta sto passando un file da 200MB e funziona perfettamente, quindi di nuovo ho passato lo stesso file e poi l'eccezione Outofmemory. è necessario disporre della memoria dopo ogni operazione di ReadAllText? – Neel

+0

@CoreDeveloper: dipende se si mantiene ancora il riferimento alla stringa. Che cosa stai facendo con esso? Forse puoi consumarlo in qualche modo e quindi sovrascrivere la variabile con il prossimo risultato di 'ReadAllText'. –

2

si deve chiudere IDisposable solo casi, di solito per mezzo di usando, ad esempio:

// StreamReader is IDisposable and should be Closed/Disposed 
    // either explicitly or by using 
    using (StreamReader sr = new StreamReader(filePath)) { 
    String base64 = sr.ReadToEnd(); 
    ... 
    } 

in quanto non si dispone di un caso IDisposable nel codice (File.ReadAllText restituisce String non hai IDisposable) non hai nulla da chiudere/Disponi

+0

Ah capisco. +1 per menzionare IDisposable in relazione al tipo di ritorno. – Subby

4

So che questa domanda ha avuto risposta e questo è quasi un anno ormai ma per chi cerca e legge questa domanda, vorrei suggerire di chiudere un file quando don con esso, o almeno fare un'indagine come mostra la mia risposta.

Non sono un esperto di programmazione ma di recente mi sono imbattuto in questa situazione.

Ho creato un programma C# WinForms e ho utilizzato File.ReadAllText per copiare il testo in una stringa. Successivamente ho provato a eliminare il file, direttamente dalla cartella non attraverso il programma, ma ho ricevuto un errore che il file era ancora aperto in un altro programma. Ho quindi smesso di eseguire il programma ed è stato in grado di eliminare il file.

Questa è la mia esperienza in Visual Studio 2012 Ultimate. Si potrebbe supporre che faccia qualcosa di diverso, ma è quello che ha fatto per me.

Quando ho utilizzato StreamReader.ReadToEnd quindi StreamReader.Close sullo stesso file, non ho avuto problemi a eliminare il file durante l'esecuzione del programma.

+0

Questo è in realtà come funziona nella vita reale. Ho dovuto usare il lettore di stream per evitare questa situazione. – kemsky

Problemi correlati