BinaryFormatter.Serialize()在FileStream.Flush()和FileStream.Close()之前完成吗?

时间:2016-12-07 11:07:43

标签: c# .net visual-studio visual-studio-2010

我将我的类列表保存到二进制文件中,并使用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();
    }
  }
}

最后一个代码是我的读者。

1 个答案:

答案 0 :(得分:0)

您使用FileMode.Create会导致程序在文件存在时覆盖您的文件。 (我想这就是你的意思&#34;文件被销毁了#34;。

如果你想添加新行,你应该使用FileMode.OpenOrCreate,就像在日志文件中一样......

请参阅:MSDN创建:

  

指定操作系统应创建新文件。如果该文件已存在,则将被覆盖。这需要FileIOPermissionAccess.Write权限。 FileMode.Create等同于请求如果文件不存在,则使用CreateNew;否则,请使用截断。如果文件已存在但是是隐藏文件,则抛出UnauthorizedAccessException异常。