我在一个Page_Load调用函数中有Following Code。当启动Visual Studio后第一次加载页面时,一切都很好。
但是在此之后对File的任何其他打开调用都返回IOException: "File is in use by another process"
,即使在VisualStudio Solution中直接打开File也会返回此错误(当然不是作为Exception)。
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
的事情,以便多个进程可以访问这个文件吗?
5条答案
按热度按时间zz2j4svz1#
为什么文件仍然被锁定?为什么完全重新启动Visual Studio会重置文件?当检查文件属性时,它说[...]我不知道为什么文件仍然被锁定:可能是因为你的代码在流关闭/释放之前失败了。
关于 “为什么完全重新启动Visual Studio [...]":因为您可能正在使用IIS Express或ASP.NET Dev Server,它们在您关闭IDE时会关闭,因此文件上的锁定将被释放,因为持有锁定的进程不再运行。
关于 “为什么文件仍然被锁定?[...]”,这可能是因为文件流没有关闭,因为有时线程可能没有成功结束,锁没有被释放。
正如其他答案所说,检查
using
块如何避免IDisposable
对象不会被释放:字符串
我只是在阅读这个文件。我可以做一些类似于adLockOptimistic的事情,以便多个进程可以访问该文件吗?
是的,看看
File.Open
方法和FileShare
枚举:File.Open
:http://msdn.microsoft.com/en-us/library/y973b725.aspxFileShare
枚举:http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspxdgiusagp2#
学习使用
using
:字符串
using
构造确保了当你离开块时,即使抛出异常,文件也会被关闭。你的问题可能不在这里,而是在代码中的其他地方。你必须遍历所有代码,寻找你打开文件的地方,但不要把它放在
using
语句中。fruv7luv3#
一个老问题,但不幸的是,给出的答案可能不适用于这个问题。
Windows中的具体问题在于Windows行为的两个方面:
a)当打开用于写入的文件的句柄关闭时,Microsoft反恶意软件服务打开文件以检查新写入的数据是否有恶意软件;
B)在所有句柄关闭后,操作系统本身会保持文件打开一段时间。这段时间可以从几秒到几分钟不等,具体取决于文件的性质和其他因素。
我们在产品中多次遇到这个问题,因此不得不为这种情况提供特殊支持-我们的内核模式试图在文件的最后一个句柄关闭时立即关闭文件。
t9eec4r04#
尝试使用
using
块,它可能无法解决锁问题,但对于一次性对象来说,它是更好的形式。字符串
另外,尝试在
mailinglist_FileStream
之前关闭mailinglist_Reader
。xj3cbfub5#
你只需要读权限。由于某些原因,FileStream也会打开写权限,所以只需要指定只读:
第一个月
我在PowerShell(使用dotnet类)中遇到了类似的情况。