2014-12-04 107 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

爲什麼flush方法? – Steve 2014-12-04 22:12:52

+0

我得到相同的結果。不斷只是最新的數字。 – Steve 2014-12-04 22:20:14

+0

@Steve,因爲它在原始代碼中。我只是刪除了無關的if塊。 – 2014-12-04 22:32:50

2

你做錯了什麼:

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

一個簡單的else就足夠了。

但是,如果有人在已執行「不存在」檢查或在執行「存在」檢查後刪除文件後有人創建文件,那麼仍然不會發生異常。


lock (sync) 
... 
lock (synk) 

您鎖定在不同的同步對象。

除此之外,代碼將始終在同一個線程(UI線程)上執行,因爲計時器滴答是由Windows消息處理的。這意味着,lock陳述可能可以省略(如果您沒有在其他地方顯式使用線程)。


但是當我嘗試讀取該文件

實際上,這兩個碼片被寫入文件。

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

FileMode.Create (MSDN)覆蓋現有文件。 FileMode.OpenFileAccess.Read會更適合閱讀。

然後,當然,使用BinaryReader (MSDN)

+1

'OpenOrCreate'也會覆蓋,除非將它與'Append'結合。 – 2014-12-04 22:33:50

+0

@DStanley謝謝。我只專注於閱讀部分,所以我更新了我的答案以使用FileMode.Open和FilAccess.Read。我不確定他是否真的想在文件中追加或只有一個隨機數。 – 2014-12-04 22:39:18

相關問題