2013-07-16 12 views
7

robie co następuje:Czy konieczne jest zamknięcie pliku po wywołaniu ReadAllText?

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

To działa perfekcyjnie. Chcę zapytać, czy muszę zamknąć plik lub coś podobnego po przeczytaniu. A jeśli tak, to w jaki sposób?

Odpowiedz

17

Nie, nie musisz jawnie zamykać pliku, File.ReadAllText zajmuje się tym za Ciebie.

The documentation zawiera tę informację bardzo wyraźnie:

Ta metoda otwiera plik, odczytuje każdy wiersz pliku, a następnie dodaje każdą linię jako element łańcucha. Następnie zamyka plik.
[...]
Gwarantuje się, że uchwyt pliku zostanie zamknięty tą metodą, nawet jeśli zostaną wprowadzone wyjątki.

+0

Rightyho. Dziękuję Ci bardzo. – Subby

8

Nie trzeba niczego zamykać podczas korzystania z File.ReadAllText, ponieważ czytnik strumienia podlewania jest zamknięty w sposób niejawny.

MSDN: File.ReadAllText

Otwiera plik tekstowy, czyta wszystkie linie pliku i następnie zamyka plik .

Oto realizacja w .NET 4 (ILSpy):

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

Oświadczenie using rozporządza StreamReader (nawet w przypadku błędu), że również zamyka go.

+0

Dziękuję bardzo Tim. – Subby

+0

Użyłem ReadAllText i jego usługi okna, więc po raz pierwszy przechodzę 200MB pliku i działa idealnie, a następnie ponownie przekazuję ten sam plik następnie jego wyrzucanie wyjątku Outofmemory. czy jest wymagane, aby usunąć pewną pamięć po każdej operacji ReadAllText? – Neel

+0

@CoreDeveloper: zależy od tego, czy nadal masz referencję do łańcucha. Co z tym robisz? Być może możesz go jakoś zużyć, a następnie zastąpić zmienną następnym wynikiem "ReadAllText". –

2

Trzeba zamknąć IDisposable tylko przypadki, zwykle za pomocą użyciu, np:

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

ponieważ nie mają IDisposable instancji w kodzie (File.ReadAllText powraca String który nie jest IDisposable) nie masz nic do zamknięcia/usunięcia

+0

Ah Widzę. +1 za wymienienie IDisposable w odniesieniu do typu zwrotu. – Subby

4

Wiem, że to pytanie zostało odebrane, a to już prawie rok, ale dla tych, którzy wyszukują i czytają to pytanie, chciałbym zasugerować zamknięcie pliku, gdy don e z tym, albo przynajmniej przeprowadzi śledztwo, jak moja odpowiedź.

Nie jestem ekspertem od programowania, ale ostatnio spotkałem się z tą sytuacją.

Stworzyłem program C# WinForms i użyłem File.ReadAllText do skopiowania tekstu do napisu. Potem próbowałem usunąć plik, bezpośrednio z folderu, nie przez program, ale dostałem błąd, że plik był nadal otwarty w innym programie. Następnie przestałem uruchamiać program i mogłem usunąć plik.

To jest moje doświadczenie w Visual Studio 2012 Ultimate. Mógłby zrobić coś innego, ale tak właśnie zrobiło to dla mnie.

Kiedy użyłem StreamReader.ReadToEnd, a następnie StreamReader.Close na tym samym pliku, nie miałem problemu z usunięciem pliku podczas uruchamiania programu.

+0

Tak właśnie działa w prawdziwym życiu. Musiałem użyć czytnika strumienia, aby uniknąć tej sytuacji. – kemsky

Powiązane problemy