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