我有这个保存pdf文件的代码。
FileStream fs = new FileStream(SaveLocation, FileMode.Create);
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
fs.Flush();
fs.Close();
工作正常。但是,有时它不会立即释放锁定,并导致文件锁定异常,并且在此次运行后运行函数。
在 fs.Close() 后,是否有理想的方法可以立即释放文件锁
答案 0 :(得分:16)
这是理想的:
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();
}
}
using更具可读性。
更新:
@aron,现在我正在考虑
File.WriteAllBytes(SaveLocation, result.DocumentBytes);
看起来比理想的更漂亮: - )
答案 1 :(得分:5)
我们在生产中看到了同样的问题,并使用包含它的using()语句。
这里的罪魁祸首之一是反病毒软件,它可以在文件关闭后潜入,在发布之前抓住它以检查它是否包含病毒。
但是,即使所有的防病毒软件都在混合中,在存储在网络共享上的文件的高负载系统中,我们偶尔也会看到这个问题。 A,咳嗽,短暂的Thread.Sleep(),咳嗽,关闭后似乎治好了。如果有人有更好的解决方案,我很乐意听到它!
答案 2 :(得分:3)
我无法想象为什么在文件关闭后会保持锁定。但是你应该考虑将它包装在一个using statment中,以确保即使引发异常也关闭了文件
using (FileStream fs = new FileStream(SaveLocation, FileMode.Create))
{
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}
答案 3 :(得分:3)
如果在此之后运行的函数是同一个应用程序的一部分,那么更好的方法可能是在整个过程开始时打开文件进行读/写,然后将文件传递给每个函数而不关闭直到过程结束。然后,应用程序不必阻止等待IO操作完成。
答案 4 :(得分:1)
当使用.Flush()时,这对我有用。我必须在using语句中添加一个close。
using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite))
{
imageFile.Write(bytes, 0, bytes.Length);
imageFile.Flush();
imageFile.Close();
}
答案 5 :(得分:0)
当我关闭FileStream并立即在另一个类中打开文件时,也遇到了同样的问题。 using语句不是解决方案,因为FileStream已在另一个位置创建并存储在列表中。清除列表是不够的。
在可以重用文件之前,流似乎需要由垃圾收集器释放。如果关闭和打开之间的时间太短,则可以使用
GC.Collect();
关闭流后。这对我有用。
我想Ian Mercer的使线程进入睡眠状态的解决方案可能具有相同的效果,从而使GC有时间释放资源。