Java File.renameTo()
является проблематичным, особенно в Windows, похоже.
Как сообщает документация API,
Многие аспекты поведения этого метод по своей сути зависит от платформы: переименовать возможно, не сможет файл из одной файловой системы в другую, он может быть не атомарным, а может не удалось, если файл с конечный абстрактный путь уже существует. Возвращаемое значение всегда должно проверьте, чтобы операция переименования была успешной.
В моем случае, как часть процедуры обновления, мне нужно переместить (переименовать) каталог, который может содержать гигабайты данных (много подкаталогов и файлов разного размера). Перемещение всегда выполняется внутри одного раздела/диска, поэтому нет реальной необходимости физически перемещать все файлы на диске.
Не должно быть никаких блокировок файлов для содержимого каталога, который нужно перенести, но, тем не менее, renameTo() не выполняет свою работу и возвращает false. (Я просто догадываюсь, что, возможно, некоторые блокировки файлов истекают несколько произвольно в Windows.)
В настоящее время у меня есть метод резервного копирования, который использует копирование и удаление, но это отстой, потому что может потребоваться много времени, в зависимости от размера папки. Я также рассматриваю возможность простого документирования того факта, что пользователь может перемещать папку вручную, чтобы не дожидаться часа, возможно. Но правильный путь, очевидно, был бы чем-то автоматическим и быстрым.
Итак, мой вопрос: вы знаете альтернативный, надежный подход к быстрому переходу/переименованию с Java на Windows, либо с простым JDK, либо с какой-либо внешней библиотекой. Или, если вы знаете простой способ обнаружить и освободить любые блокировки файлов для данной папки и всего ее содержимого (возможно, тысячи отдельных файлов), это тоже будет хорошо.
Изменить. В этом конкретном случае кажется, что мы ушли, используя только renameTo()
, принимая во внимание еще несколько вещей; см. этот ответ.