我有此代码保存PDF文件。

FileStream fs = new FileStream(SaveLocation, FileMode.Create);
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
fs.Flush();
fs.Close();

它可以正常工作。但是,有时它不会立即释放锁定,这会导致文件锁定异常,并在此运行后运行功能。

有没有理想的方式来释放文件锁 紧随其后fs.close()

有帮助吗?

解决方案

这是理想的:

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

这大致相当于:

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();
    }
}

使用 更可读。


更新:

@aron,现在我在想

File.WriteAllBytes(SaveLocation, result.DocumentBytes);

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

其他提示

我们已经在生产中看到了同样的问题,其中包装它。

这里的顶级罪魁祸首之一是反病毒软件,可以在文件关闭后偷偷摸摸,抓住它在释放之前不含病毒。

但是,即使将所有反病毒软件都脱颖而出,在非常高的负载系统中,将存储在网络共享上的文件中,我们仍然有时会看到问题。 a,咳嗽,短螺纹sleep(),咳嗽后,似乎可以治愈它。如果有人有更好的解决方案,我很想听听!

我无法想象为什么在文件关闭后会保持锁定。但是您应该考虑将其包裹在使用的陈述中,以确保即使提出异常,也要关闭文件

using (FileStream fs = new FileStream(SaveLocation, FileMode.Create))
{
  fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);  
}

如果在此之后运行的功能是同一应用程序的一部分,那么更好的方法可能是在整个过程的开头打开读/写的文件,然后将文件传递给每个函数而不关闭,直到过程结束。然后,将不需要该应用程序阻止等待IO操作完成。

使用.flush()时,这对我有用,我必须在使用语句中添加一个近距离。

 using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite))
 {
     imageFile.Write(bytes, 0, bytes.Length);
     imageFile.Flush();
     imageFile.Close();
  }

当我关闭文件流并立即在另一堂课中打开文件时,只是遇到了同样的问题。使用语句不是解决方案,因为文件流是在另一个地方创建并存储在列表中的。清除清单还不够。

看来需要在文件重复使用文件之前被垃圾收集器释放。如果关闭和开放之间的时间太短,则可以使用

GC.Collect();

关闭流之后。这对我有用。

我想伊恩·默瑟(Ian Mercer)的解决方案使线程入睡可能会产生相同的效果,从而使GC有时间释放资源。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top