Tym razem będzie o czymś bardzo prostym, chociaż przyznam, że mnie trochę zdziwiło. Zwykle metody w .NET Framework'u działają tak jak podpowiada mi moja intuicja tym razem było trochę inaczej, a ponieważ po rozmowie w gronie znajomych okazało się, że i inni dali się na to złapać, więc opiszę to jako ostrzeżenie ;).
Zacznijmy więc od początku: Jak można w najprostszy sposób wpisać coś do pliku? Chyba najłatwiej jest stworzyć strumień do zapisu, przy pomocy metody File.OpenWrite, a następnie wpisać do niego dowolne dane. Oczywiście jeśli dany plik nie istnieje ta funkcja sama zadba by go sobie utworzyć, proste?, nieprawdaż? Przeanalizujmy jednak poniższy przykład:
static void Main( string[] args ) { //mamy dwa bufory //pierwszy dłuższy (15 bajtów/znaków) byte[] buffer1 = new byte[ 15 ]; //drugi krótszy (10 bajtów/znaków) byte[] buffer2 = new byte[ 10 ]; for ( int i = 0; i < buffer1.Length; i++ ) buffer1[ i ] = 65; //litera: A for ( int j = 0; j < buffer2.Length; j++ ) buffer2[ j ] = 66; //litera: B // otwieramy plik (tworzony jest jeśli go // jeszcze nie ma) using ( Stream file = File.OpenWrite( "myfile.txt" ) ) { file.Write( buffer1, 0, buffer1.Length ); } //ponowny raz otwieramy ten plik do zapisu using ( Stream file = File.OpenWrite( "myfile.txt" ) ) { file.Write( buffer2, 0, buffer2.Length ); } // kolejny raz otwieramy ten plik (tym razem do odczytu using ( StreamReader reader = new StreamReader( "myfile.txt" ) ) { //wypisujemy na ekran to co odczytujemy z pliku Console.WriteLine( reader.ReadToEnd() ); } Console.ReadLine(); }
Jak myślicie co się pojawi na ekranie?
A) AAAAAAAAAAAAAAA
B) BBBBBBBBBB
C) wyjątek
D) żadna z powyższych
Czy już znacie odpowiedź? ..... oczywiście to odpowiedź.... D
Czy wszyscy podali taką odpowiedź? bo ja dałem się złapać (myślałem że prawidłowa jest odpowiedź B), natomiast na ekranie pojawi się: BBBBBBBBBBAAAAA. Dlaczego? ano dlatego, że za drugim razem otwieramy już istniejący plik, ustawiamy się na jego początku (bynajmniej nie kasujemy starego) i wpisujemy odpoczątku 10 liter B. Pozostała zawartość pliku jest nie zmieniona.
Skąd się wziął mój błąd, ano myślałem, że działa to podobnie jak strumienie w konsoli:
type plik.txt >plik2.txt - przepisuje zawartość plik.txt do plik2.txt (jeśli plik2.txt istniał zostaje on wykasowany)
type plik.txt >>plik2.txt - dopisuje zawartość plik.txt na końcu plik2.txt (jeśli plik2.txt nie istnieje, to go wcześniej tworzy)
Dodatkowo w MSDN nie ma nic na temat takiego zachowania (np. krótkiego "remark" z ostrzeżeniem).
Ktoś z Was (czytelników) też dał się na to złapać?