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

C# 为什么我不能写二进制文件?,c#,io,binary,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

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

我做错了什么?有人能帮我吗?提前感谢。

您正在使用
文件模式打开流。创建
,它将覆盖现有文件。使用
FileMode。改为追加

注意,您不必检查文件是否存在;如果文件模式不存在,您可以使用
FileMode.openor创建| 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();
    }
}

您正在使用
FileMode.Create
打开流,这将覆盖现有文件。使用
FileMode。改为追加

注意,您不必检查文件是否存在;如果文件模式不存在,您可以使用
FileMode.openor创建| 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();
    }
}

你做错了什么:

if (!File.Exists(path))
...
else if (File.Exists(path))
...
一个简单的
或者
就足够了

但是,如果有人在执行“不存在”检查后创建文件,或者在执行“存在”检查后删除文件,则不会发生异常


您正在锁定不同的同步对象

除此之外,代码将始终在同一个线程(UI线程)上执行,因为计时器信号由Windows消息处理。这意味着,
lock
station可能会被省略(如果您没有在其他地方明确使用线程)


但是当我试着读文件的时候

实际上,两个代码段都在写入文件

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

覆盖现有文件<代码>文件模式。打开
文件访问。阅读
更适合阅读


然后,当然,使用一个。

你做错了什么:

if (!File.Exists(path))
...
else if (File.Exists(path))
...
一个简单的
或者
就足够了

但是,如果有人在执行“不存在”检查后创建文件,或者在执行“存在”检查后删除文件,则不会发生异常


您正在锁定不同的同步对象

除此之外,代码将始终在同一个线程(UI线程)上执行,因为计时器信号由Windows消息处理。这意味着,
lock
station可能会被省略(如果您没有在其他地方明确使用线程)


但是当我试着读文件的时候

实际上,两个代码段都在写入文件

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

覆盖现有文件<代码>文件模式。打开
文件访问。阅读
更适合阅读


然后,当然,使用一个。

为什么使用冲洗法?我得到了相同的结果。一直只更新最新的号码。@Steve,因为它是在原始代码中。我刚刚删除了无关的
if
块。@Steve,你确定复制的示例代码正确吗?我已经把你的代码和这个答案中的代码结合起来,它肯定会在文件的末尾添加新的数字。你是如何确认你的代码是否工作的?为什么使用flush方法?我得到了同样的结果。一直只更新最新的号码。@Steve,因为它是在原始代码中。我刚刚删除了无关的
if
块。@Steve,你确定复制的示例代码正确吗?我已经把你的代码和这个答案中的代码结合起来,它肯定会在文件的末尾添加新的数字。如何确认代码是否正常工作?
open或create
也会覆盖,除非您将其与
Append
@DStanley组合使用,谢谢。我只关注阅读部分,所以我更新了答案,使用FileMode.Open和FilAccess.read。我不确定他是真的想追加还是文件中只有一个随机数。
open或create
也会覆盖,除非你将其与
append
@DStanley组合使用,谢谢。我只关注阅读部分,所以我更新了答案,使用FileMode.Open和FilAccess.read。我不确定他是真的想追加还是文件中只有一个随机数。