文件流以保存文件,然后立即在.NET中解锁?
-
28-09-2019 - |
题
我有此代码保存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有时间释放资源。
不隶属于 StackOverflow