Я пишу некоторый код как часть структуры для открытия файла. Файл имеет пользовательский тип и не должен открываться более чем одним экземпляром моего приложения. Чтобы остановить открытие нескольких файлов, я использую файловый поток для создания файла блокировки, а затем сохраняю указанный файловый поток открытым.
Похоже, что это работает для предотвращения открытия файла другим экземпляром моего приложения (так как не удастся воссоздать поток блокировки в открытом коде файлов), но если файл находится в общей сетевой папке и сеть удаляется, то исходный Приложение также больше не может получить доступ к файлу.
Код для получения потока блокировки выглядит следующим образом:
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, сообщая, что процесс не может получить доступ к файлу, как он открыт в другом процессе (что не должно происходить, я не думаю).
Надеюсь, в этом есть какой-то смысл, я огляделся по сторонам, но ничего не нашел об этом конкретном сценарии, поэтому я подумал, посмотрю, был ли у кого-нибудь здесь подобный опыт.
веселит.