为什么我不能写二进制文件?

时间:2014-12-04 21:56:03

标签: c# io binary

我正在尝试在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);
            }

我做错了什么?有没有人可以帮助我?提前谢谢。

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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)