Как переименовать (не перемещать) файл в JDK7?
Я немного запутался со всеми этими новыми классами файлового ввода-вывода в JDK7.
Допустим, у меня есть Path
и я хочу переименовать файл, который он представляет. Как мне указать новое имя, когда снова ожидается Path
?
Path p = /* path to /home/me/file123 */;
Path name = p.getName(); /* gives me file123 */
name.moveTo(/* what now? */); /* how to rename file123 to file456? */
ПРИМЕЧАНИЕ: зачем мне JDK7? Обработка символических ссылок !
Проблема в том, что я должен делать это с файлами, имена и расположение которых известны во время выполнения. Итак, что мне нужно, это безопасный метод (без исключительных побочных эффектов) для создания нового имени-пути некоторого старого имени-пути.
Path newName(Path oldName, String newNameString){
/* magic */
}
Ответы
Ответ 1
У вас есть строка пути, и вам нужно создать экземпляр Path. Вы можете сделать это с помощью метода getPath или решить. Здесь один из способов:
Path dir = oldFile.getParent();
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);
oldFile.moveTo(target);
Обратите внимание, что он проверяет, является ли parent нулевым (похоже, ваше решение этого не делает).
Ответ 2
В JDK7 Files.move() предоставляет краткий и краткий синтаксис для переименования файлов:
Path newName(Path oldName, String newNameString) {
return Files.move(oldName, oldName.resolveSibling(newNameString));
}
Сначала мы получаем путь к новому имени файла, используя Path.resolveSibling(), и мы используем Files.move() для фактического переименования.
Ответ 3
Хорошо, после того, как все вышло, кажется, я нашел правильный метод:
// my helper method
Path newName(Path oldFile, String newNameString){
// the magic is done by Path.resolve(...)
return oldFile.getParent().resolve(newNameString);
}
// so, renaming is done by:
oldPath.moveTo(newName(oldFile, "newName"));
Ответ 4
Если вы посмотрите Apache Commons IO, там будет класс FileNameUtils. Это делает тонну вещей по. имена путей к файлу и, кроме всего прочего, надежно разделяют имена путей и т.д. Я думаю, что вам предстоит пройти долгий путь к тому, что вы хотите.
Ответ 5
Если путь назначения идентичен пути источника, за исключением имени файла, он будет переименован, а не будет перемещен.
Итак, для вашего примера путь moveto должен быть
/home/me/file456
Ответ 6
Если вы не можете заставить Java делать то, что вы хотите в Unix, я рекомендую скрипты Python (запускаемые вашей Java-программой). Python получил поддержку Unix-скриптов, и это не Perl:) Это может звучать неэлегантно для вас, но на самом деле в более крупной программе вам будет полезно использовать правильный инструмент для работы.