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等.
| 归档时间: |
|
| 查看次数: |
11367 次 |
| 最近记录: |