File.delete () возвращает false - PullRequest
3 голосов
/ 23 марта 2011

Я создал файл из своего Java-программирования и регистрирую некоторые данные, используя API-протокол Apache Commons Logging, в частности, реализацию Log4j.

После завершения ведения журнала я устанавливаю ссылку на класс Log как null. Когда я сейчас пытаюсь удалить файл, в который я вошел, File.delete () возвращает false.

Удаляя файл из проводника Windows во время отладки (в момент перед вызовом File.delete ()), я получаю уведомление «невозможно удалить: используется другой программой».

Нет открытых зависимостей на файл из моего кода (все потоки закрыты). Единственный объект, который может получить доступ к файлу, это объект Log, который я установил в null перед вызовом File.delete ()

Есть ли в любом случае, я могу видеть, какой конкретный объект содержит ссылку на ресурс файла? Есть ли другой способ заставить объект Log освободить ресурс, кроме установки его на ноль? Можно ли принудительно удалить файл?

Ответы [ 2 ]

5 голосов
/ 23 марта 2011

Просто установка переменной на нуль не заставляет объект собирать мусор.Кроме того, есть вероятность, что он зарегистрирован в статической карте - вам нужно проверить реализацию, чтобы быть уверенным.(Я думаю, что в некоторых версиях используются слабые ссылки, но в других нет.)

Есть ли причина, по которой у вас есть , чтобы удалить файл прямо сейчас?Возможно, вы захотите попробовать File.deleteOnExit(), который может иметь больше шансов на удаление файла - хотя это зависит от того, на что точно рассчитано время.(Кроме того, остерегайтесь возможной утечки памяти , если вы вызываете deleteOnExit несколько раз.)

Не могли бы вы просто удалить файл после завершения приложения или, возможно, при следующем запуске?

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

3 голосов
/ 23 марта 2011

В вашем случае регистратор записывает это в файл - Файл заблокирован другим процессом.


Обновление:

Проблема в том, что у app log4js есть блокировка записи в вашем файле. Таким образом, пока приложение не закрыто, вы не можете удалить файл. Решением было бы создание файлов меньшего размера или установка флага добавления на false, поэтому при перезапуске сервера старый файл журнала удаляется автоматически.

Попробуйте использовать

org.apache.log4j.LogManager.shutdown();

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

Обязательно вызовите метод close() нашей собственной реализации Appender (который является подклассом AppenderSkeleton), чтобы он надлежащим образом закрывал appenders из getAllAppenders ().

...