我在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
的事情,以便多个进程可以访问文件吗?
答案 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) 在关闭文件的所有句柄后,操作系统本身会将文件打开一段时间。根据文件的性质和其他因素,此时间可能从几秒到几分钟不等。
我们在我们的产品中多次看到这个问题,并且不得不为这种情况提供特殊支持 - 我们的内核模式尝试在文件的最后一个句柄关闭后立即关闭该文件。