我正在尝试在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);
}
我做错了什么?有没有人可以帮助我?提前谢谢。
答案 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.Open
和FileAccess.Read
更适合阅读。
然后,当然,使用BinaryReader (MSDN)。