С помощью C # можно проверить, удерживается ли блокировка файла - PullRequest
2 голосов
/ 30 марта 2009

ФОН: Я использую смещение в файле и методы блокировки / разблокировки Filestream для управления доступом для чтения / записи. Я использую следующий код, чтобы проверить, удерживается ли в данный момент блокировка файла

try
{
  fs.Lock( RESERVED_BYTE, 1 );
  fs.Unlock( RESERVED_BYTE, 1 );
  rc = 1;
}
catch
{ 
  rc = 0; 
}

ВОПРОС:
Моя цель - устранить блок try / catch. Есть ли лучший способ проверить, существует ли блокировка?

EDIT:
Примечание: этот вопрос не о том, существует ли файл. Я уже знаю, что это так. Речь идет о синхронизации доступа к записи.

Ответы [ 5 ]

6 голосов
/ 30 марта 2009

Вы можете вызвать LockFile функцию Windows API напрямую через слой P / Invoke. Вы должны использовать дескриптор, возвращаемый свойством SafeFileHandle в FileStream.

Вызов API напрямую позволит вам проверить возвращаемое значение для условия ошибки, а не прибегать к перехвату исключения.


Noah спрашивает, есть ли какие-либо издержки при вызове уровня P / Invoke по сравнению с try / catch.

Файл блокировки делает тот же вызов через слой P / Invoke и выдает исключение, если вызов LockFile возвращает 0. В вашем случае вы не выдает исключение. В случае, если файл заблокирован, вам понадобится меньше времени, потому что вы не работаете со стеком.

Фактическая настройка P / Invoke составляет около семи инструкций (для сравнения, COM-взаимодействие составляет около 40), но этот момент спорный, поскольку ваш вызов LockFile делает то же самое, что и управляемый метод (используйте P / вызывать слой).

5 голосов
/ 30 марта 2009

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

4 голосов
/ 30 марта 2009

Моя цель - устранить блок try / catch

Помните, что файловая система volatile : только то, что ваш файл находится в одном состоянии для одной операции, не означает, что он будет в том же состоянии для следующей операции. Вы должны уметь обрабатывать исключения из файловой системы.

1 голос
/ 15 мая 2009

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

A управляемый пример (все немного сложнее), утилита show для этого конкретного подмножества нативных API отладки в CLR.

0 голосов
/ 30 марта 2009

Я не думаю, что это возможно без попытки поймать.

...