Дельфи:Проверьте, используется ли файл
Вопрос
Я хочу записать/удалить файл, но иногда происходит сбой, если файл используется другой программой.Как проверить, открыт ли файл другим процессом или я могу открыть его для записи?
Решение
Проблема в том, что между тем моментом, когда вы проверяете, можете ли вы получить монопольный доступ, и открытием файла, что-то еще получает эксклюзивный доступ к файлу, и вы все равно получаете исключение.
Единственный надежный способ узнать, можете ли вы получить эксклюзивную блокировку файла, — это попытаться получить эксклюзивную блокировку файла. Если вы ее получите, значит, она у вас есть.
Если нет, вы перехватываете исключение, и либо
- Иди займись чем-нибудь другим
- Подождите некоторое время и попробуйте еще раз
Это одна из жизненных ситуаций, когда лучше просить прощения, чем разрешения :)
Другие советы
Существует новый способ узнать причину блокировки файлов для 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