重用文件流

Eri*_*tas 17 .net c# file-io filestream

在过去,我总是使用FileStream对象来写或重写整个文件,之后我会立即关闭流.但是,现在我正在开发一个程序,我想在其中保持FileStream打开,以便允许用户在两​​次保存期间保持对文件的访问.(见我之前的问题).

我正在使用XmlSerializer将我的类序列化为from和XML文件.但是现在我保持FileStream打开,以便稍后用于保存(重新序列化)我的类实例.如果我重复使用相同的文件流而不是使用新的文件流,是否需要进行任何特殊考虑?我是否需要在保存之间将流重置为开头?如果稍后保存的大小比以前的保存小,那么FileStream将保留旧文件中的剩余字节,从而创建一个损坏的文件?我是否需要做一些事情来清除文件,以便它表现得好像我每次都在写一个全新的文件?

Aar*_*ght 14

您的怀疑是正确的 - 如果您重置打开文件流的位置并写入小于文件中已有内容的内容,它将留下尾随数据并导致损坏的文件(当然,取决于您对"损坏"的定义) ).

如果要覆盖该文件,您应该在完成后关闭该流,并在准备好重新保存时创建一个新流.

我从您的链接问题中注意到您将文件保持打开状态,以防止其他用户同时写入该文件.这可能不是我的选择,但如果你打算这样做,那么我认为你可以通过stream.SetLength(0)在连续保存之间调用来"清除"文件.


Mar*_*ell 10

有多种方法可以做到这一点; 如果要重新打开文件,可能将其设置为截断:

using(var file = new FileStream(path, FileMode.Truncate)) {
    // write
}
Run Code Online (Sandbox Code Playgroud)

如果您在打开文件时覆盖文件,则在编写后修改它:

file.SetLength(file.Position); // assumes we're at the new end
Run Code Online (Sandbox Code Playgroud)

我会尽量避免删除/重新创建,因为这会丢失任何ACL等.


And*_*rew 7

另一个选项可能是在开始重写文件之前使用SetLength(0)截断文件.