asp.net close()不会为其他进程释放文件

p5fdfcr1  于 5个月前  发布在  .NET
关注(0)|答案(5)|浏览(46)

我在一个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的事情,以便多个进程可以访问这个文件吗?

zz2j4svz

zz2j4svz1#

为什么文件仍然被锁定?为什么完全重新启动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枚举:

dgiusagp

dgiusagp2#

学习使用using

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

字符串
using构造确保了当你离开块时,即使抛出异常,文件也会被关闭。
你的问题可能不在这里,而是在代码中的其他地方。你必须遍历所有代码,寻找你打开文件的地方,但不要把它放在using语句中。

fruv7luv

fruv7luv3#

一个老问题,但不幸的是,给出的答案可能不适用于这个问题。
Windows中的具体问题在于Windows行为的两个方面:
a)当打开用于写入的文件的句柄关闭时,Microsoft反恶意软件服务打开文件以检查新写入的数据是否有恶意软件;
B)在所有句柄关闭后,操作系统本身会保持文件打开一段时间。这段时间可以从几秒到几分钟不等,具体取决于文件的性质和其他因素。
我们在产品中多次遇到这个问题,因此不得不为这种情况提供特殊支持-我们的内核模式试图在文件的最后一个句柄关闭时立即关闭文件。

t9eec4r0

t9eec4r04#

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

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

字符串
另外,尝试在mailinglist_FileStream之前关闭mailinglist_Reader

xj3cbfub

xj3cbfub5#

你只需要读权限。由于某些原因,FileStream也会打开写权限,所以只需要指定只读:
第一个月
我在PowerShell(使用dotnet类)中遇到了类似的情况。

相关问题