Я пытаюсь переместить следующие файлы в операторе if с помощью FileUtils.moveFileToDirectory после преобразования файлов. Файлы JPG и gif перемещаются в новую папку, но всякий раз, когда программа находит файл ICO, она не перемещает этот файл в новую папку и выдает ему StackTrace: java.io.IOException: Не удалось удалить исходный путь к исходному файлу. файла "после копирования в" новый путь к файлу ". Вот код метода:
public void storeOriginalImages() {
for(File file: model.getFileList()) {
if (file.getName().endsWith(".GIF") || file.getName().endsWith(".gif") || file.getName().endsWith(".JPG")
|| file.getName().endsWith(".jpg") || file.getName().endsWith(".ico") || file.getName().endsWith(".ICO")
|| file.getName().endsWith(".BMP") || file.getName().endsWith(".bmp")) {
System.out.println("in copy else");
File illegalExtension = new File(file.getAbsolutePath());
File illegalExtensionDest = new File(model.getTargetexcelFilepath() + "/" + model.getFolderName() + "_img_backup");
System.out.println(illegalExtension + "/" + illegalExtensionDest);
try {
FileUtils.moveFileToDirectory(illegalExtension, illegalExtensionDest, true);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Вот как файл ICO конвертируется в png:
else if (s.getName().endsWith(".ico") || s.getName().endsWith(".ICO")) {
List<BufferedImage> bi = ICODecoder.read(new File(s.getAbsolutePath()));
System.out.println("reading");
ImageIO.write(bi.get(0), "png", new File(s.getParentFile().getAbsoluteFile(), fileNameWithOutExt + ".png"));
System.out.println("Ico was converted.");
}
@Debmalya Biswas Перед вызовом этого метода программа конвертирует файлы jpg и gif в jpeg и файлы ico в png. Файлы jpg и gif перемещаются в новую папку, но не файлы ico.
Подозреваю, что как-то программа не может освободить ресурс ico. Мне нравится метод, которым вы поделились. Думаю, проблема в методе конвертации
@DebmalyaBiswas Я тоже изучал это и видел другой вопрос, похожий на этот, где в комментариях предлагается использовать .close () файл, но это не позволит мне. Я также добавил код для преобразования.
Выясните причину, не обращая внимания на конверсию. Просто попробуйте переместить файл, не конвертируя его. У вас все еще есть исключение? Если да, проверьте права доступа к файлу.
@DodgyCodeException он работал без преобразования файла ICO, и я даже пошел и получил полный контроль над папкой, и он все еще дает мне ту же ошибку.
Тогда это звучит так, как будто при преобразовании файл остается открытым. Из исходного кода ICODecoder я вижу, что он пытается закрыть файл и регистрируется на уровне FINE, если не может. Зарегистрируйте все и посмотрите, оставит ли ICODecoder сообщение журнала, в котором говорится, что он не может закрыть файл.
@DodgyCodeException Файл не закрылся, и я не нашел его, чтобы закрыть. К счастью, Дебмаля Бисва помогла мне найти решение. Спасибо вам обоим за то, что нашли время и помогли мне!
Я понимаю, в чем проблема. Более ранние версии image4j не закрывали файл. Это было исправлено в 2015 году. Вы должны получить последнюю версию image4j. Тогда у вас не будет этой проблемы.
@DodgyCodeException Он работает на моем стационарном компьютере, на котором я написал этот код, но не хотел работать на моем ноутбуке или ноутбуке моих одноклассников.




Я взял ваш пример и немного отредактировал. Кажется, когда ICODecoder пытается читать из файла с помощью потока, он не закрывает его должным образом, поэтому вам нужно закрыть его в своем коде. Вот рабочий пример
File oldFile = new File("a.ico");
try (InputStream inputStream = new FileInputStream(oldFile)) {
List<BufferedImage> bi = ICODecoder.read(inputStream);
ImageIO.write(bi.get(0), "png", new File("a" + ".png"));
} catch (IOException e) {
LOG.error("Something happend", e);
}
FileUtils.moveFile(oldFile, new File("a.jpg"));
Перед перемещением файла необходимо закрыть входной поток.
Спасибо, что нашли время и помогли мне. Это сработало!
Вы уверены, что файл ico не используется другим процессом?