C# 为什么我不能写二进制文件?
我正在尝试在WinForm中写入和读取二进制文件。我以为我做到了,但当我尝试读取文件时,我只得到写入文件的新数字(每5秒生成一个随机数字),该文件不保留以前的数字。 我所做的: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
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。我不确定他是真的想追加还是文件中只有一个随机数。