Переименование файла без использования 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-файлом плохо спроектированы и не генерируют надлежащих исключений, и не предоставляют никаких кодов ошибок при сбое!