Delphi: проверьте, используется ли файл - PullRequest
7 голосов
/ 02 февраля 2009

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

Ответы [ 5 ]

30 голосов
/ 02 февраля 2009

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

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

Если нет, вы ловите исключение, и либо

  • Иди, сделай что-нибудь еще
  • Подождите немного и попробуйте снова

Это одна из жизненных ситуаций, когда лучше просить прощения, чем разрешения:)

4 голосов
/ 03 января 2011

Существует новый способ получения источника блокировки файлов для Vista и здесь: http://www.remkoweijnen.nl/blog/2011/01/03/cannot-access-files-but-need-the-origin/

UserMode: Лучший способ записи в заблокированный файл - попросить пользователя закрыть его в другом процессе. В пакетных процессах вы должны игнорировать такой файл и регистрировать проблему. Предоставление имени другого процесса - очень хороший способ найти решение для пользователя.

0 голосов
/ 02 февраля 2009

IsFileInUse, как указано в http://delphi.about.com/cs/adptips1999/a/bltip0999_3.htm

0 голосов
/ 02 февраля 2009

Если вы хотите узнать, какая программа хранит дескриптор вашего файла, используйте Process Monitor (скачать с MicroSoft).

Этот инструмент имеет интерфейс командной строки, поэтому вы можете использовать интерфейс сценариев вашего языка (например, java.lang.Process) для запуска инструмента и отображения полезного сообщения об ошибке.

0 голосов
/ 02 февраля 2009

Не уверен, на каком языке программирования вы хотели бы проверить, можете ли вы записать в файл. В Java java.io.File.canWrite () может выполнить эту работу за вас.

Общие сведения:

В UNIX-подобных ОС вы можете использовать команду lsof .

...