Проверьте блокировку файла без попытки поймать - PullRequest
1 голос
/ 14 февраля 2009

Есть ли лучший способ проверить, не заблокирован ли файл, а затем открыть файл, чтобы поймать исключение. У меня есть файловый менеджер, работающий с каталогом, и мне нужно что-то сделать с файлом после того, как файл полностью перемещен / создан в этом месте Разве исключение не является ударом по производительности? Есть ли лучший способ?

Private Function FileAvailable(ByVal fileName As String) As Boolean
    Try
        Using inputStream As FileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)
            Return True
        End Using
    Catch ex As IOException
        Return False
    End Try
End Function

или

private bool FileAvailable(string fileName) { 
try { 
    using (FileStream inputStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) { 
        return true; 
    } 
} 
catch (IOException ex) { 
    return false; 
} 

}

Небольшой совет эксперта о лучшем способе. Спасибо

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

Ответы [ 2 ]

8 голосов
/ 14 февраля 2009

Как часто вы собираетесь это делать? Чтобы поместить это в контекст, предположим, что вы проверяете один раз каждые 50 миллисекунд - что довольно часто. Мой ноутбук (в прошлый раз, когда я проверял) смог выбросить более 100 исключений за миллисекунду ... поэтому стоимость создания исключения будет меньше 0,02% от общего времени - и это при условии, что он всегда занят !

Теперь, конечно, было бы неплохо иметь API, чтобы избежать этого - что-то вроде TryOpenFile - но в его отсутствие я бы просто убрал его в другую функцию и не беспокоился.

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

1 голос
/ 25 марта 2011

А как насчет Mutex ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...