当网络断开连接时,在网络上使用FileStream

3

我正在编写一个框架的代码,用于打开自定义类型的文件。为了防止其他应用程序打开该文件,我使用文件流创建一个锁文件,并保持该文件流处于打开状态。

这似乎能够阻止另一个应用程序打开该文件(因为在文件打开代码中,它无法重新创建锁流),但如果文件位于网络共享上,并且网络断开,则原始应用程序也无法再访问该文件。

获取锁流的代码如下:

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告诉我有一个进程无法访问该文件,因为它正在被其他进程打开(我认为不应该发生这种情况)。
希望这有些意义,我已经搜索过了,但没有找到关于这个特定场景的任何信息,所以我想看看这里是否有人有类似的经验。
谢谢。

你应该将你的答案作为一个答案发布,而不是编辑你的问题。我已经替你完成了这个过程,并将我的答案标记为社区wiki(这样我就不会因此获得声望)。话虽如此,如果你发布你的答案并接受它,那么我会删除我的答案(如果你的答案很好/正确/合适,你可以得到赞同和声望)。 - casperOne
你介意复制答案,然后选择那个答案吗?我的答案(用你的名字)本来就不应该出现在这里。一旦你发布了那个答案,我就可以删除我的答案(用你的名字)。你的答案应该是用你的名字。 - casperOne
2个回答

2

Dracanus的回答:


我曾经认为这个问题是.NET框架一些深层次、黑暗可怕的问题,但实际上解决方案比我想象中要简单得多。我将初始流的创建更改为使用FileShare.Read。通过仔细检查FileShare枚举,我发现FileShare.None也会拒绝创建它的进程的打开访问权限 (

拒绝共享当前文件。任何请求打开文件(由此进程或另一个进程)都将失败,直到文件关闭。

)。

因此,通过将其更改为FileShare.Read,我可以在恢复网络连接后重新获取锁定,然后在删除实际文件之前正确地处理它。

希望这篇文章不会让你感到晕乎乎的,对别人也有用。像大多数我的编程问题一样,这是一个问题比我预期的要简单,从而让我走了弯路 :)


0

所以我花了很多时间假设问题是一些深奥、可怕的 .Net 东西,但实际上修复比我想象的要容易一些。我将初始流创建更改为使用 FileShare.Read。在仔细检查 FileShare 枚举后,我发现 FileShare.None 拒绝了创建它的进程的开放访问权限(

拒绝共享当前文件。任何请求打开该文件(由此进程或另一个进程)都将失败,直到关闭该文件。

因此,通过将其更改为 FileShare.Read,我可以在重新建立网络连接时重新获取锁定,然后在删除实际文件之前正确处理它。

我希望这不会太过混乱,并对其他人有用。与我的大多数编程问题一样,这是一个问题比我预期的简单,使我迷失了方向 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接