2013-03-12 4 views
12

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

+6

Ну, зачем вы хотите знать? Чтобы открыть файл в любом случае? Затем вы можете пропустить чек и попробовать прямо, потому что вы все равно можете получить гонку. – Joey

+0

@ Не обязательно, но в основном причина, но если задействован сторонний инструмент, было бы полезно определить, может ли файл быть опущен или не вызвать вызов открытого метода третьей стороны, так или иначе, я бы ожидал, такой метод и не выполнять заявление об уловах как искусство плана. – CloudyMarble

+0

Возможный дубликат [Как проверить, открыт ли файл другим процессом в C?] (Http://stackoverflow.com/questions/1951791/how-to-check-if-a-file-is-already- open-by-another-process-in-c) –

ответ

15

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

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

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

+0

@CodyGray Thnx для ответа, но is'nt это то же самое, что и проверка контроля доступа к файлу, который можно изменить между ними до тех пор, пока я не получу доступ к нему? но у меня есть эта опция, чтобы спросить эти элементы управления доступом без необходимости запускать в инструкцию catch, это все равно может произойти, но тогда это не будет частью моего плана. – CloudyMarble

+1

Вы правы. Но, хотя вы не можете избежать проверки исключений в конце, все равно может быть интересно иметь функцию, которая проверяет это, не обязательно открывая файл. Некоторые полезные инструменты предоставляют эту информацию, и они не основаны на коде try/catch. –

+0

@SimonMourier Легко сделать это без try/catch. Просто назовите 'CreateFile'. –

2

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

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

1

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

HANDLE WINAPI CreateFile (...)

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

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


BOOL WINAPI LockFile (...)

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

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

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

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

+1

Спросите себя, откуда появился hFile? –

+0

Ваше право! Я закончил с CreateFile, хотя он не генерирует исключение и позволяет возвращать значение readbale, это все еще попытка открыть файл. – CloudyMarble

+1

Именно это я и другие рассказывали вам. Так получилось, что механизмы .net для открытия файлов сбой сигнала с исключениями. Механизм сигнала Win32 сигнализирует об ошибке. По сути, это заканчивается в конце концов. –