FileStream保存文件然后立即在.NET中解锁?

aro*_*ron 9 c# filestream filelock

我有这个代码保存pdf文件.

FileStream fs = new FileStream(SaveLocation, FileMode.Create);
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
fs.Flush();
fs.Close();
Run Code Online (Sandbox Code Playgroud)

它工作正常.但是,有时它不会立即释放锁定,并导致文件锁定异常,并且在此次运行后运行函数.

有没有理想的方法在fs.Close()之后立即释放文件锁

Dar*_*rov 16

这是理想的:

using (var fs = new FileStream(SaveLocation, FileMode.Create))
{
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}
Run Code Online (Sandbox Code Playgroud)

这大致相当于:

FileStream fs =  null;
try
{
    fs = new FileStream(SaveLocation, FileMode.Create);
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}
finally
{
    if (fs != null)
    {
        ((IDisposable)fs).Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用是更具有可读性.


更新:

@aron,现在我在想

File.WriteAllBytes(SaveLocation, result.DocumentBytes);
Run Code Online (Sandbox Code Playgroud)

看起来比理想的更漂亮:-)

  • 这是如何使用`using`语句的一个很好的例子,但由于它最终等同于OP的代码,它没有解决所提出的问题. (9认同)
  • @Chris Lively - Close()将释放非托管资源.垃圾收集在两种情况下都完全相同.这个问题与垃圾收集无关. (7认同)
  • 处理呼叫关闭.关闭电话刷新.最终结果是一样的.您的更改有利于避免在异常或提前退货的情况下意外保留文件,但它不会导致文件锁定被更快地删除. (5认同)
  • @Jeffrey,我知道我喝了很多啤酒,但我真的不知道这与OPs代码有什么相同之处. (3认同)
  • 相当于基本功能.然而,这个代码在处理垃圾收集方面完全不同.这是OP的问题.+1 (3认同)
  • @Chris Lively - 我刚刚证实了我怀疑调用Close()也会调用GC.SurpressFinalize().Close()和Dispose()之间的垃圾收集是相同的. (2认同)

Ian*_*cer 5

我们在生产中看到了同样的问题,并使用包含它的using()语句.

这里的罪魁祸首之一是反病毒软件,它可以在文件关闭后潜入,在发布之前抓住它以检查它是否包含病毒.

但是,即使所有的防病毒软件都在混合中,在存储在网络共享上的文件的高负载系统中,我们偶尔也会看到这个问题.A,咳嗽,短暂的Thread.Sleep(),咳嗽,关闭后似乎治好了.如果有人有更好的解决方案,我很乐意听到它!