Использование FileStream в сети, когда сеть падает - PullRequest
3 голосов
/ 26 марта 2012

Я пишу некоторый код как часть структуры для открытия файла. Файл имеет пользовательский тип и не должен открываться более чем одним экземпляром моего приложения. Чтобы остановить открытие нескольких файлов, я использую файловый поток для создания файла блокировки, а затем сохраняю указанный файловый поток открытым.

Похоже, что это работает для предотвращения открытия файла другим экземпляром моего приложения (так как не удастся воссоздать поток блокировки в открытом коде файлов), но если файл находится в общей сетевой папке и сеть удаляется, то исходный Приложение также больше не может получить доступ к файлу.

Код для получения потока блокировки выглядит следующим образом:

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

Надеюсь, в этом есть какой-то смысл, я огляделся по сторонам, но ничего не нашел об этом конкретном сценарии, поэтому я подумал, посмотрю, был ли у кого-нибудь здесь подобный опыт.

веселит.

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Answer by Dracanus :


Поэтому я потратил много времени, предполагая, что проблема была какой-то глубокой, мрачной и пугающей .Net, хотя на самом деле исправление было немногопроще чем я думал.Я изменил начальное создание потока, чтобы использовать FileShare.Read.При более внимательном рассмотрении перечисления FileShare я обнаружил, что FileShare.None отклонил открытый доступ для процесса, который его тоже создал (

Отклоняет совместное использование текущего файла. Любой запрос на открытие файла (этим процессомили другой процесс) не будет работать до тех пор, пока файл не будет закрыт.

Таким образом, изменив это значение на FileShare.Read, я мог бы повторно получить блокировку, когда сетевое соединение было восстановлено, и затем правильно утилизировать ее перед удалениемфактический файл.

Я надеюсь, что это не слишком много бреда и полезно для кого-то еще. Как и в большинстве моих проблем с программированием, это был случай, когда проблема была проще, чем я ожидал, и бросила менясо своего следа:)

0 голосов
/ 23 апреля 2013

Так что я потратил много времени, предполагая, что проблема была какой-то глубокой, темной и страшной вещью .Net, хотя на самом деле исправить это было немного проще, чем я думал.Я изменил начальное создание потока, чтобы использовать FileShare.Read.При более внимательном рассмотрении перечисления FileShare я обнаружил, что FileShare.None отклонил открытый доступ для процесса, который его тоже создал (

Отклоняет совместное использование текущего файла. Любой запрос на открытие файла (этим процессом или другим процессом)) не будет работать до тех пор, пока файл не будет закрыт.

Таким образом, изменив это значение на FileShare.Read, я мог бы повторно получить блокировку, когда сетевое соединение было восстановлено, и затем правильно утилизировать ее перед удалением фактического файла.

Я надеюсь, что это не слишком бред и полезен для кого-то еще. Как и в большинстве моих проблем с программированием, это был случай, когда проблема оказалась проще, чем я ожидал, и отбросил меня с пути:)

...