Подтвердить что ты не робот

Проверка, используется ли файл без попытки улова?

Есть ли способ проверить, используется ли файл или не открывается другим процессом, не пытаясь его открыть и перехватить исключение? Нет ли метода обслуживания для проверки такой вещи?

4b9b3361

Ответ 1

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

Я не могу придумать каких-либо убедительных преимуществ для предварительной защитной проверки. Это просто приводит к ненужному дублированию кода.

Если бы существовала такая функция IsFileAccessible, она, вероятно, была бы реализована как гигантский блок try/catch, который пытался открыть файл, поймал неудачи и вернул результат.

Ответ 2

Могу ли я проверить, можно ли открыть файл, не пытаясь откройте его?

Структура .net, так же как и API Windows ниже, не предоставляет такой функциональности. Если вы хотите узнать, можно ли открыть файл, вы должны попытаться открыть его и проверить наличие сбоя.

Ответ 3

Интересный способ избежать try catch (но подразумевает попытку открыть) - это LockFile() или CreateFile() функции:

HANDLE WINAPI CreateFile (...)

Если функция завершается успешно, возвращаемое значение является открытым дескриптором для указанного файла, устройства, именованного канала или почтового слота.

Если функция не работает, возвращается значение INVALID_HANDLE_VALUE. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.


BOOL WINAPI LockFile (...)

Если функция завершается успешно, возвращаемое значение отличное от нуля (TRUE),.

Если функция не работает, возвращаемое значение равно нулю (FALSE). Получить расширенную информацию об ошибке, вызовите GetLastError.

Это блокирует указанный файл для исключительного доступа вызывающим процессом и при сбое записывает информацию об ошибке в последнюю ошибку потока, которая может быть восстановлена ​​с помощью GetLastError.

По-прежнему можно подумать, что между unlockFile и OpenFile другой процесс может заблокировать файл, но можно свести к минимуму этот период, заблокировав файл до момента его открытия.