2014-12-04 5 views
0

Я пытаюсь написать и прочитать двоичный файл в WinForm. Я думал, что сделал это, но когда я пытаюсь прочитать файл, я получаю только новый номер, который был записан в файл (случайные числа сгенерированы каждые 5 секунд), этот файл не сохраняет предыдущие цифры. то, что я сделал:Почему я не могу написать двоичный файл?

private void timer1_Tick(object sender, EventArgs e) 
     { 
      string path = @"C:\Test\test.dat"; 
      lbl1.Text = string.Format("{0:0.0}", -6 + rand.NextDouble() * 17); 
      double temp = Convert.ToDouble(lbl1.Text); 
      try 
      { 
        if (!File.Exists(path)) 
        { 
        lock (sync) 
        { 
         FileStream outf = new FileStream(path, FileMode.CreateNew, FileAccess.Write); 
         BinaryWriter bw = new BinaryWriter(outf); 
         bw.Write(temp); 
         bw.Close(); 
        } 
        } 
        else if (File.Exists(path)) 
        { 
        lock (synk) 
        { 
         FileStream outf1 = new FileStream(path, FileMode.Create, FileAccess.Write); 
         BinaryWriter bw1 = new BinaryWriter(outf1); 
         bw1.Write(temp); 
         bw1.Flush(); 
         bw1.Close(); 
        } 
        } 
       } 
      catch (System.IO.FileNotFoundException ioe) 
      { 
       MessageBox.Show(ioe.Message); 
      } 

Что я делаю неправильно? Есть ли кто-нибудь, кто может мне помочь? Заранее спасибо.

ответ

4

Вы открываете поток, используя FileMode.Create, который перезаписывает существующий файл. Вместо этого используйте FileMode.Append.

Обратите внимание, что вам не нужно проверять, существует ли файл или нет; Вы можете использовать FileMode.OpenOrCreate | FileMode.Append, чтобы создать его, если он не существует:

try 
{ 
    lock (sync) 
    { 
     FileStream outf = new FileStream(path, FileMode.OpenOrCreate | FileMode.Append, FileAccess.Write); 
     BinaryWriter bw = new BinaryWriter(outf); 
     bw.Write(temp); 
     bw.Flush(); 
     bw.Close(); 
    } 
} 
+0

Почему флеш-метод? – Steve

+0

Я получаю тот же результат. Постоянно только последнее число. – Steve

+0

@Steve, потому что это было в исходном коде. Я просто удалил посторонний блок if. –

2

Что вы делаете неправильно:

if (!File.Exists(path)) 
... 
else if (File.Exists(path)) 
... 

Простой else был бы достаточно.

Однако не исключение может произойти, если кто-то создаст файл после того, как проверка «не существует» уже выполнена или файл будет удален после проверки «существует».


lock (sync) 
... 
lock (synk) 

Вы блокировка на различных объектах синхронизации.

Кроме этого код всегда будет выполняться в одном потоке (поток пользовательского интерфейса), так как тики таймера обрабатываются сообщениями Windows. Это означает, что статут lock, вероятно, может быть опущен (если вы явно не используете потоки в другом месте).


, но когда я пытаюсь прочитать файл

На самом деле оба кода куски при записи в файл.

bw.Write(temp); 
... 
bw1.Write(temp); 

FileMode.Create (MSDN) перезаписывает существующие файлы. FileMode.Open и FileAccess.Read лучше всего подходят для чтения.

Тогда, конечно, используйте BinaryReader (MSDN).

+1

'OpenOrCreate' также перезаписывается, если вы не объедините его с' Append'. –

+0

@DStanley Спасибо. Я сосредоточился только на прочитанной части, поэтому я обновил свой ответ, чтобы использовать FileMode.Open и FilAccess.Read.Я не уверен, действительно ли он хочет добавить или иметь только одно случайное число в файле. –

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