9

我在 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

4 回答 4

10

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

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

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

正如其他答案所说,检查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 var mailinglist_FileStream = new FileStream(@"\foobarFile.txt", FileMode.Open, FileShare.ReadWrite);
using var 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! 

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

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

于 2013-02-19T11:04:14.993 回答
8

学习使用using

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

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

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

于 2013-02-19T11:05:35.190 回答
0

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

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

另外,尝试关闭mailinglist_Readerbefore mailinglist_FileStream

于 2013-02-19T11:03:25.200 回答
0

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

具体在 Windows 中的问题在于 Windows 行为的两个方面:

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

b)操作系统本身在关闭文件的所有句柄后保持文件打开一段时间。这个时间可以从几秒到几分钟不等,具体取决于文件的性质和其他因素。

We saw this problem many times in our products and had to provide special support for this case - our kernel-mode attempts to close the file as soon as the last handle to it is closed.

于 2021-07-24T16:56:32.017 回答