Переименование файла без использования renameTo () - Java - PullRequest
8 голосов
/ 06 января 2010

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

a.renameTo(b)

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

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

Ответы [ 5 ]

5 голосов
/ 14 мая 2010

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

5 голосов
/ 06 января 2010

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

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

4 голосов
/ 06 января 2010

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

3 голосов
/ 06 января 2010

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

1 голос
/ 06 января 2010

Как насчет:

a.renameTo(new File("/your/path/here/");
...