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

时间:2010-04-19 20:00:21

标签: c# filestream filelock

我有这个保存pdf文件的代码。

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

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

fs.Close() 后,是否有理想的方法可以立即释放文件锁

6 个答案:

答案 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有时间释放资源。