2013-03-16 3 views
6

Я пытаюсь создать простую программу, которая хранит данные в файле журнала TXT. Это мой кодFileStream.WriteLine() не записывает в файл

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(); 
} 

То, что я достиг это: файл будет создан, но ничего не получает в ней написано. Я проверил множество сообщений, но я не нашел никакой конкретной помощи.

+3

Прежде всего, попробуйте /, наконец, блоки не нужны, вы можете использовать ' используя вместо этого блок. – antonijn

+3

вам может понадобиться очистить StreamWriter: 'fw.Flush()' –

+0

StreamWriter имеет конструктор, который берет строку, путь к файлу и bool, установленный в true для добавления. Это помогло бы вам упасть в яму успеха. –

ответ

7

Добавление звонка в Flush Поток работает. Это потому, что вы обертываете FileStream. StreamWriter будет писать на FileStream, но вам нужно указать, когда отправить Stream в фактический файл. Кроме того, вы можете обменять ваш try finally с 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

Заключите ваш StreamWriter в использовании блока, чтобы убедиться, что все правильно закрыты в конце использования файла, и я не думаю, что вам нужно создайте для этого FileStream.

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

Обратите внимание, что StreamWriter имеет конструктор, который принимает два параметра, имя файла, чтобы создать/открыть и флаг, указывающий, что файл должен быть открыт в режиме добавления или удаления See StreamWriter docs

1

Действительно, Flush() - это ответ; однако вместо этого я бы использовал 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

Попробуйте использовать это - просто замените массив:

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

Всегда используйте using (как уже упоминалось), и вы не столкнетесь с проблемами (или должны думать об этом) ...

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"); 
} 

(также вы могли бы закрыли писатель вместо FileStream, который должен когда-либо работал)

Проблема заключается в том, как я, насколько я могу сказать ...

FileStream.Close фактически Stream.Close - и это вызывает Dispose, но это не виртуальная, так что делает некоторую общую очистку.

FileStream.Dispose который называется неявно при использовании using - делает конкретные Flush, а затем Close/Dispose - так делает правильную определенную очистку.

Вы можете избежать любого из этого через using, что и, как правило, рекомендуется шаблон (и, честно говоря никогда не втянул меня в какой-либо из них)

Смежные вопросы