Вопрос

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

Это было полезно?

Решение

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

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

Если нет, вы перехватываете исключение, и либо

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

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

Другие советы

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

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

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

Общий:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top