我将我的类列表保存到二进制文件中,并使用FileStream和BinaryFormatter。
private void SaveCustomers()
{
FileStream fs = null;
try
{
fs = new FileStream( Application.StartupPath + dataPath + @"\" + customersFilename, FileMode.Create, FileAccess.Write );
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, customers);
}
catch (Exception ex)
{
MessageBox.Show( ex.Message, "Fehler beim speichern der Besucherdaten", MessageBoxButtons.OK, MessageBoxIcon.Error );
}
finally
{
if (fs != null)
{
fs.Flush();
fs.Close();
}
}
}
在我的程序中的某个时刻,文件会被"销毁"。由于这是唯一有权在文件中写入的方法,我认为这种方法就是问题。
我的假设是,当文件流被刷新并关闭时,BinaryFormatter没有完成。
它最近才发生,因为文件开头大约8 MB,它完美无缺。
我的假设是对的吗?或者它是完全不同的。
private void LoadCustomers()
{
FileStream fs = null;
try
{
fs = new FileStream( Application.StartupPath + dataPath + @"\" + customersFilename, FileMode.OpenOrCreate, FileAccess.Read );
BinaryFormatter bf = new BinaryFormatter();
customers = (List<Customer>)bf.Deserialize( fs );
if (customers == null) customers = new List<Customer>();
}
catch (Exception ex)
{
MessageBox.Show( ex.Message, "Fehler beim laden der Besucherdaten", MessageBoxButtons.OK, MessageBoxIcon.Error );
}
finally
{
if (fs != null)
{
fs.Flush();
fs.Close();
}
}
}
最后一个代码是我的读者。
答案 0 :(得分:0)
您使用FileMode.Create
会导致程序在文件存在时覆盖您的文件。 (我想这就是你的意思&#34;文件被销毁了#34;。
如果你想添加新行,你应该使用FileMode.OpenOrCreate
,就像在日志文件中一样......
请参阅:MSDN创建:
指定操作系统应创建新文件。如果该文件已存在,则将被覆盖。这需要FileIOPermissionAccess.Write权限。 FileMode.Create等同于请求如果文件不存在,则使用CreateNew;否则,请使用截断。如果文件已存在但是是隐藏文件,则抛出UnauthorizedAccessException异常。