2012-03-26 85 views
3

我正在编写一些代码作为打开文件的框架的一部分。该文件是自定义类型,不应该由我的应用程序的多个实例打开。要停止打开多个文件,我使用文件流来创建锁定文件,然后保持所述文件流打开。当网络丢失时在网络上使用FileStream

这似乎在阻止我的应用程序的另一个实例打开文件(因为它将无法在文件打开代码中重新创建锁定流),但是如果该文件位于网络共享上并且网络丢失,那么原来的应用程序也无法再访问该文件。

的代码来获取锁流如下:

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

你应该发布你的答案*作为答案*,而不是编辑你的题。我已经为你做了这件事,并将*我的*答案标记为社区wiki(所以我没有为它赢得声誉)。也就是说,如果你发布你的答案,你可以接受它,然后我会删除我的答案(如果答案是好的/正确的/正确的,你可以在你的答案上投票)。 – casperOne 2012-03-26 17:51:11

+0

您是否介意复制答案并选择答案?我的回答(以你的名义)不应该在这里摆在首位。一旦你发布了答案,我可以删除我的(这是你的名字)。你的答案应该是*你的*名字。 – casperOne 2013-04-10 12:32:30

回答

0

因此,我花了很多时间,假设问题是深深的,可怕的.Net事情时,事实上修复比我想象的容易一点。我将初始流创建更改为使用FileShare.Read。在仔细检查FileShare枚举后,我发现FileShare.None拒绝了创建它的进程的开放访问(

拒绝共享当前文件。任何打开文件的请求(通过此进程或其他进程)将直到文件关闭为止

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

我希望这不是太乱码,对其他人有用。与我的大部分编程问题一样,这是一个比我预期的问题更简单的例子,并且把我扔掉了它的踪迹:)

2

Answer by Dracanus


所以我花了很多时间假设的问题是一些深层次的,黑暗的可怕的.Net的事情时,其实修复比我想象的更容易一些。我将初始流创建更改为使用FileShare.Read。在进一步检查FileShare枚举后,我发现FileShare.None拒绝创建它的进程的开放访问(

拒绝共享当前文件任何请求打开文件(通过此进程或其他进程这一更改为FileShare.Read时再在网络连接建立,我可以重新获取锁,然后删除实际文件之前进行妥善处理,直到该文件被关闭)会失败。

左右。

我希望这不是太乱码,对某些人很有用否则。与我的大部分编程问题一样,这是一个比我预期的问题更简单的例子,并且把我扔掉了它的踪迹:)