Я немного перепутан со всеми этими новыми классами Файлового ввода-вывода в JDK7.
Скажем, у меня есть a Path
и хочу переименовать файл, который это представляет. Как я указываю новое имя, когда снова a 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 */
}
У вас есть строка пути, и вам нужно создать экземпляр пути. Вы можете сделать это с помощью метода getPath или resolve. Вот один способ:
Path dir = oldFile.getParent();
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);
oldFile.moveTo(target);
Обратите внимание, что он проверяет, является ли parent нулевым (похоже, ваше решение этого не делает).
Хорошо, попробовав все, кажется, я нашел правильный метод:
// 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"));
Если путь назначения идентичен пути к источнику , за исключением имени файла , он будет переименован, а не перемещен.
Таким образом, для вашего примера, путь перемещения должен быть
/home/me/file456
Если вы посмотрите на Apache Commons IO, то увидите класс с именем FileNameUtils. Он делает тонну вещей с именами путей к файлам и будет (помимо всего прочего) надежно разделять имена путей и т.д. Я думаю, что это должно дать вам долгий путь к тому, что вы хотите.