2013-03-16 14 views
6

Próbuję utworzyć proste oprogramowanie, które przechowuje dane w pliku dziennika TXT. To jest mój kodFileStream.WriteLine() nie zapisuje do pliku

FileStream fs = null; 
StreamWriter fw = null; 
try 
{ 
    fs= new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); 
    fw = new StreamWriter(fs); 
    fw.Write("sadadasdsadsadsadas"); 

    for (int i = 0; i < AnimalShelter.AnimalList.Count; i++) 
    { 
     fw.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>"); 
     Console.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>"); 
    } 
} 
catch(IOException) 
{ 
    MessageBox.Show("ERROR THROWN"); 
} 
finally 
{ 
    if (fs!= null) fs.Close(); 
    // if (fw != null) fw.Close(); 
} 

Co osiągnąłem to: plik zostanie utworzony, ale nic nie zostanie w nim napisane. Sprawdziłem wiele postów, ale nie mogłem znaleźć żadnej konkretnej pomocy.

+3

Przede wszystkim try/finally bloki nie są potrzebne, można użyć ' zamiast tego użyj bloku '. – antonijn

+3

konieczne może być przepłukanie StreamWriter: 'fw.Flush()' –

+0

StreamWriter ma konstruktor, który pobiera ciąg, ścieżkę do pliku i wartość logiczną, ustawioną na wartość true, aby dołączyć. Pomogłoby ci to wpaść w otchłań sukcesu. –

Odpowiedz

7

Dodanie połączenia do Flush strumienia działa. Dzieje się tak, ponieważ owijasz FileStream. StreamWriter napiszę do FileStream, ale musisz wskazać, kiedy wysłać Stream do rzeczywistego pliku. Ponadto, można wymienić swoje try finally z using:

try 
{ 
    using (var fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
    { 
     using (var fw = new StreamWriter(fs)) 
     { 
      fw.Write("sadadasdsadsadsadas"); 

      for (int i = 0; i < AnimalShelter.AnimalList.Count; i++) 
      { 
       fw.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>"); 
       Console.WriteLine("<chipNr>" + AnimalShelter.AnimalList[i].ChipRegistrationNumber + "<chipNr>"); 

      } 
      fw.Flush(); // Added 
     } 
    } 
} 
catch(IOException) 
{ 
    MessageBox.Show("ERROR THROWN"); 
} 
4

ująć w swoje StreamWriter wykorzystaniem bloku, aby mieć pewność, że wszystko jest prawidłowo zamknięty na końcu wykorzystaniem plików, także nie sądzę, trzeba utworzyć FileStream, aby to działało.

try 
{ 
    string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "textme.txt") 
    using(fw = new StreamWriter(fileName, true)) 
    { 
     ...... 
    } 
} 
catch(IOException) 
{ 
    MessageBox.Show("ERROR THROWN"); 
} 

Zauważ, że StreamWriter ma konstruktora, który przyjmuje dwa parametry, nazwę pliku, aby utworzyć/otwarty i flagę, aby wskazać, że plik powinien zostać otwarty w trybie dopisywania lub nadpisane See StreamWriter docs

1

Rzeczywiście, Flush() jest odpowiedzią; jednak użyłbym zamiast tego File.WriteAllLines().

try 
{ 
    var fileName = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)+"/textme.txt"; 
    var lines = AnimalShelter.AnimalList.Select(o=> "<chipNr>" + o.ChipRegistrationNumber + "</chipNr>"); 
    File.WriteAllLines(fileName, lines); 
    foreach(var line in lines) 
     Console.WriteLine(line); 
} 
catch(IOException) 
{ 
    MessageBox.Show("ERROR THROWN"); 
} 
0

Spróbuj użyć tego - po prostu wymienić tablicę:

try 
{ 
    using (Stream fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
    { 
     using (StreamWriter sw = new StreamWriter(fs)) 
     { 
      int[] test = new int[] { 0, 12, 23, 46 }; 
      sw.Write("sadadasdsadsadsadas"); 
      for (int i = 0; i < test.Length; i++) 
      { 
       sw.WriteLine("<chipNr>" + test[i] + "<chipNr>"); 
       Console.WriteLine("<chipNr>" + test[i] + "<chipNr>"); 
      } 
      sw.Close();      
     } 
     fs.Close(); 
    } 

} 
catch (IOException) 
{ 
    MessageBox.Show("ERROR THROWN"); 
} 
2

Zawsze używaj using (jak już wspomniano) i nie będzie napotkasz problemy (lub trzeba myśleć o tym) ...

using (FileStream fs = new FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/textme.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
using (StreamWriter fw = new StreamWriter(fs)) 
{ 
    fw2.Write("sadadasdsadsadsadas"); 
} 

(też mogłeś zamknięte pisarza zamiast FileStream, który powinien już pracował)

Problemem jest to, jak dalece jak mogę powiedzieć ...

FileStream.Close jest rzeczywiście Stream.Close - a to wywołuje Dispose ale to nie jest wirtualny, więc ma pewne ogólne porządki.

FileStream.Dispose który nazywa się niejawnie podczas korzystania using - ma specyficzny Flush a następnie Close/Usuwać - tak robi właściwą specyficzną porządki.

można uniknąć tego poprzez using jako że jest powszechnie zalecany wzór (i szczerze mówiąc nigdy mnie do któregokolwiek z nich)

Powiązane problemy