FileStream.close()不会释放其他进程的文件

时间:2013-02-19 10:58:43

标签: c# asp.net filestream file-access

我在Page_Load调用函数中有以下代码。在启动Visual Studio后第一次加载页面时,一切正常 但是在返回IOException: "File is in use by another process"之后对文件的任何其他打开调用,即使在VisualStudio解决方案中直接打开文件时也会返回此错误(当然不是异常)

FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open);
PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream);
//Do some stuff with the file
mailinglist_FileStream.Close();
mailinglist_Reader.Close();
mailinglist_Reader.Dispose();
mailinglist_FileStream.Dispose();

为什么文件仍然被锁定?为什么完全重启Visual Studio重置文件? 在检查文件属性时,它说:

  

构建行动:内容
  复制到输出目录:不要复制

我只是在读这个文件。我可以做一些类似于adLockOptimistic的事情,以便多个进程可以访问文件吗?

4 个答案:

答案 0 :(得分:8)

  

为什么文件仍然被锁定?以及为什么完全重启Visual   Studio重置文件?在检查文件属性时,它说[...]   我不知道为什么文件仍然被锁定:可能是因为您的代码在流关闭/处理之前失败了。

关于“为什么要完全重新启动Visual Studio [...]”:因为您可能正在使用在关闭IDE时关闭的IIS Express或ASP.NET Dev Server,因此锁定文件因为持有锁的进程不再运行而被释放。

关于“为什么文件仍然被锁定?[...] ”这可能是因为文件流没有关闭,因为有时线程可能无法成功结束且锁定不是' t释放。

正如其他答案所述,请检查using块如何避免IDisposable个对象不会被处置:

// FileShare.ReadWrite will allow other processes 
// to read and write the target file even if other processes 
// are working with the same file
using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite))
using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream))
{
      // Do your stuff. Using blocks will call Dispose() for 
      // you even if something goes wrong, as it's equal to a try/finally! 
      // Also check how using statements can be chained without extra { }           
 }
  

我只是在读这个文件。我可以做一些类似的事情   adLockOptimistic,以便多个进程可以访问文件?

是的,请查看File.Open方法和FileShare枚举:

答案 1 :(得分:4)

学习使用using

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read))
{
    ...
}

using构造确保即使抛出异常也会在离开块时关闭文件。

您的问题可能不在此处,但代码中的其他位置。您必须浏览所有代码并查找已打开文件的位置,但不要将其放在using语句中。

答案 2 :(得分:0)

尝试使用using块,它可能无法解决您的锁定问题,但它对于一次性对象来说是更好的形式。

using (FileStream mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open))
{
    using (PeekingStreamReader mailinglist_Reader = new PeekingStreamReader(mailinglist_FileStream))
    {
        ...            
    }
}

另外,请尝试在mailinglist_Reader之前关闭mailinglist_FileStream

答案 3 :(得分:0)

一个老问题,但不幸的是,给出的答案可能不适用于该问题。

Windows 特有的问题在于 Windows 行为的两个方面:

a) 当为写入而打开的文件句柄关闭时,Microsoft 反恶意软件服务会打开文件以检查新写入的数据是否存在恶意软件;

b) 在关闭文件的所有句柄后,操作系统本身会将文件打开一段时间。根据文件的性质和其他因素,此时间可能从几秒到几分钟不等。

我们在我们的产品中多次看到这个问题,并且不得不为这种情况提供特殊支持 - 我们的内核模式尝试在文件的最后一个句柄关闭后立即关闭该文件。