Я столкнулся с проблемой unusal. Я создаю инструмент, который планируется запустить каждые 5 минут. Он подберет zip-файлы из определенного каталога и извлечет файлы (в зависимости от имени файла) в пункт назначения. Я использую zipentry
, чтобы получить каждое имя файла в zip-файле, а затем извлечение по мере необходимости, после чего я возвращаю их (ZIP-файлы, как только закончу все файлы в zip-файле) в конкретный каталог, а затем удалю zip-файл. Но иногда (не всегда) zip-файлы не удаляются. Потому что я использую fileutils.forcedelete()
. Я получаю исключение: не может удалить файл. Поэтому я изменил код на использование fileutils.forcedeleteonexit()
, но некоторые файлы остались в источнике.Не удается удалить zip-файл после распаковки?
Вот пример моего кода:
sourceFile=new file(zipfile);
zipFile = new ZipFile(sourceFile);
zEnum = (Enumeration<ZipEntry>) zipFile.entries();
for (int a = 0; a < zipFile.size(); a++)
{
ZipEntry zE = zEnum.nextElement();
//Function uses zip4j for extracting. No streams used.
extract(String sourceZipFile, String fileNameToExtract, String outputFolder);
}
//I tried it with finally either
zipFile.close();
//Using fileutils to copy. No streams used.
copyFile(sourceFile, backup);
FileUtils.forceDeleteOnExit(sourceFile);
Там нет потоков, используемых, но я получаю блокировку файлов иногда (не всегда). Что, кажется, ошибка здесь? Это проблема с zip4j, которая вызывает проблему или что-то еще? Я использую zip4j 1.3.1.
Что OS? Windows имеет печально известные проблемы с файловыми дескрипторами и удалениями ... – fge
@fge: Windows.tried в моем локальном и на сервере (Windows Server 2008 R2) –
@fge Я не могу сказать, сколько раз Windows сообщила мне «файл в используйте "при попытке удалить архив после извлечения его данных, но это, безусловно, было больше, чем я могу рассчитывать на обе руки. Является ли это ошибкой программ, которые не закрывают свои файлы вручную, или Windows сохраняет определенные файлы даже после закрытия программ? – JAB