#java #io #apache-commons #apache-commons-io
#java #io #apache-commons #apache-commons-io
Вопрос:
Я вызываю метод C через JNI, который создает два файла. Текстовый файл журнала и файл pdf в заданном каталоге. Я хочу удалить эти файлы (если они существуют) перед выполнением метода JNI.
Я использую Apache commons.io (FileUtils.forceDelete(файл file)) для этого. При выполнении я получаю исключение IOException:
java.io.IOException: Unable to delete file: D:Folderfile.log
Я проверяю состояние файла, доступное для записи, перед запуском метода удаления с помощью метода File.CanWrite(). Возвращает значение true как для файла, так и для родительского каталога.
У вас есть идеи, почему у меня проблемы с удалением файла? Насколько я знаю, метод C , который создает файлы, закрывает или разблокирует их после завершения метода. В любом случае, у меня нет доступа к исходному коду C , поэтому я не могу проверить, действительно ли это так, или изменить код.
Спасибо, Марко
Комментарии:
1. Вы уверены, что файл не используется другим процессом? Попробуйте вручную переименовать / удалить этот файл.
2. Согласно Apache SVN, метод delete() для объекта File вызывается до возникновения исключения. Это означает, что указанный файл не может быть удален в соответствии с запросом. Я предполагаю, что в файле все еще присутствует блокировка.
3. Есть идеи, как я могу снять блокировку?
4. Без знания кода, создающего файлы, очень сложно представить решение. В зависимости от режимов, которые использовались при создании файлов, вы могли бы оставить их в покое, и метод заключается в замене самих файлов. Другой источник может использовать IDE для запуска приложения. Иногда IDE блокирует файлы, даже если они не имеют к этому никакого отношения. Если возможно, вы могли бы также попытаться удалить весь каталог, но это может привести к тому же результату, что и удаление файлов.
5. Используете ли вы какое-либо средство чтения для доступа к файлу? Возможно, вы захотите закрыть программу чтения или реализовать процесс чтения с помощью try-with-resources.
Ответ №1:
Он почти наверняка заблокирован другим процессом. Если это блокировка другого процесса на уровне операционной системы (скажем, вы открыли файл в текстовом редакторе), то вам не повезет. Даже проводнику Windows может не удалиться файл, если его блокирует что-то другое. Однако взгляните на java.nio.channels.FileLock
соответствующие вызовы API.
Ответ №2:
Скорее всего, file.log
открыт другой процесс, который предотвратил бы его удаление.