Проблемы с удалением файла с помощью Java (apache commons io)

#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 открыт другой процесс, который предотвратил бы его удаление.