我正在编写一些代码作为打开文件的框架的一部分。该文件属于自定义类型,不应由我的应用程序的多个实例打开。要停止多个文件打开,我使用文件流创建一个锁定文件,然后保持所述文件流打开。
这似乎可以阻止我的应用程序的另一个实例打开文件(因为它会在文件打开代码中重新创建锁定流失败)但是如果文件在网络共享上并且网络丢失则原始文件应用程序也无法再访问该文件。
获取锁定流的代码如下:
Try
' We need to keep this stream alive to prevent other applications gaining access to the lock
mLockStream = New FileStream(mLockPath, FileMode.CreateNew, FileAccess.Write, FileShare.None)
Catch ex As UnauthorizedAccessException
Catch ex As DirectoryNotFoundException
Throw
Catch ex As IOException
Throw New ProjectInUseException(My.Resources.LocalizedResources.ProjectInUseExceptionMessage, Nothing)
End Try
在这里我第一次创建锁流,然后如果另一个应用程序尝试创建它,它会抛出异常并阻止它们进一步。这就是它需要工作的方式,不幸的是,正如我所说,如果这是通过网络完成然后由于某种原因网络连接被丢弃然后我不能删除锁流,因为我得到一个IOException告诉我一个进程不能访问该文件,因为它在另一个进程中打开(我不认为这应该发生)。
我希望这有点道理,我已经环顾四周但却没有发现这种特殊情况,所以我想我会看到这里有没有人有类似的经历。
欢呼声。
答案 0 :(得分:2)
所以我花了很多时间假设这个问题是一些深刻的,可怕的.Net事情,事实上修复比我想象的要容易一些。我更改了初始流创建以使用FileShare.Read。仔细检查FileShare枚举后,我发现FileShare.None拒绝了创建它的进程的开放访问权限(
拒绝分享当前文件。在文件关闭之前,任何打开文件的请求(通过此过程或其他过程)都将失败。
因此,通过将其更改为FileShare.Read,我可以在重新建立网络连接时重新获取锁定,然后在删除实际文件之前正确处理它。
我希望这不是太多的胡言乱语,对其他人有用。与我的大多数编程问题一样,这是一个问题比我预期的更简单的情况,并让我脱离它的踪迹:))
答案 1 :(得分:0)
所以我花了很多时间假设这个问题是一些深刻的,可怕的.Net事情,事实上修复比我想象的要容易一些。我更改了初始流创建以使用FileShare.Read。仔细检查FileShare枚举后,我发现FileShare.None拒绝了创建它的进程的开放访问权限(
拒绝分享当前文件。在文件关闭之前,任何打开文件的请求(通过此过程或其他过程)都将失败。
因此,通过将其更改为FileShare.Read,我可以在重新建立网络连接时重新获取锁定,然后在删除实际文件之前正确处理它。
我希望这不是太多的胡言乱语,对其他人有用。与我的大多数编程问题一样,这是一个问题比我预期的更简单的情况,并让我脱离它的踪迹:))