Переименование файла без использования renameTo() - Java

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

a.renameTo(b)

когда б не существует. Причина, по которой он не существует, заключается в том, что существует символическая ссылка, поэтому, если b /usr/name/folder/fileтогда б действительно /mnt/MountTest потому что символическая ссылка на этот каталог.

Итак, вопрос в том, существует ли альтернативный способ переименования файла в Java с использованием строкового значения? Если нет, как эту процедуру переименования можно сделать по-другому?

5 ответов

Решение

Переименование переименовало бы это... если бы это было в той же файловой системе.

В случае сбоя renameTo() вам необходимо скопировать его в новое место, а затем удалить оригинал.

Переименование файлов также очень проблематично в файловых системах. См. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4073756. Комментаторы отчета об ошибке опубликовали пример кода, а также отметили, что вы можете использовать Process.exec. И Apache Commons IO, и Google Guava также имеют утилиты для безопасного перемещения файлов:

Я думаю, что вы путаете вещи. Файл java.util.File не представляет файл в некоторой файловой системе. Представляет путь к файлу.

Проблема не в том, что используется символическая ссылка; проблема в том, что вы не можете атомарно переименовать через файловые системы. Мета-проблема заключается в том, что операции с Java-файлом плохо спроектированы и не генерируют надлежащих исключений, и не предоставляют никаких кодов ошибок при сбое!

Как насчет:

a.renameTo(new File("/your/path/here/");
Другие вопросы по тегам