2015-04-01 9 views
0

Я пишу программу резервного копирования с использованием Java, и я хотел бы сохранить файлы и каталоги в пункт назначения резервного копирования на основе абсолютных имен путей источников.Каков наилучший способ преобразования абсолютного имени пути для использования в качестве подкаталога?

Программа резервного копирования должна работать в разных операционных системах (Unix, Windows, Mac OS X), поэтому мне нужно преобразовать абсолютные пути к исходным файлам и каталогам.

Итак, в конце я хотел бы преобразовать абсолютный путь источника к регулярному подпутью адресата. Позвольте мне привести несколько примеров.

Unix
путь Абсолютный Источник: /главная/Thomas/данные
назначения путь: /резервного копирования
Эффективное назначения: /резервного копирования/дома/Thomas/данные

Windows
Абсолютный путь источника: c: \ Documents and Settings \ thomas
назначения Путь: е: \ резервного копирования
Эффективное назначение: е: \ BACKUP \ C \ Documents и Settings \ томас

Я мог бы использовать операции замены строк, но я ожидаю, чтобы запустить на несколько проблем и начать бесконечную историю коррекции.

Я думаю, что среда Windows требует специальной обработки из-за ведущих букв дисков. Под * nix я мог бы просто объединить два пути. Также обратите внимание, что путь источника может быть UNC-контуром под Windows, например \\ share \ data.

Я искал вокруг и нашел несколько похожих вопросов, но никто из них не ответил на мои вопросы (например, Is there a Java utility which will convert a String path to use the correct File separator char? или Convert Windows-style path into Unix path).

Возможно, у кого-нибудь есть идея или подсказка для меня или знает о библиотеке, которая уже делает то, что я ищу.

+0

Вы пробовали что-нибудь? –

+1

См. Https://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html#relativize%28java.nio.file.Path%29 – dhke

+0

Хм, может быть, я не понимаю, но метод в вашей ссылке можно использовать для вычисления «корабля отношения» между двумя путями. Я хотел бы создать новый подпуть, основанный на абсолютном пути источника и пути назначения. – Thorsten

ответ

1

Если вы используете Java 7 или новее, может оказаться полезным класс Paths и его методы. Хороший обзор здесь: https://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

Специально для вашего прецедента вам нужен subpath (получает часть пути) и resolve (сочетает в себе два пути). Я бы попробовал что-то вроде этого:

Path backupRoot = Paths.get("/backup"); 
Path docRoot = Paths.get("/home/user1/docs"); 
// This line gets the full doc path without the root 
Path docs = docRoot.subpath(0, docRoot.getNameCount()); 
// This line creates the path "/backup/home/user1/docs" 
Path backupDocs = backupRoot.resolve(docs); 
+0

Да Я использую Java 7 и уверен, что я использую классы Path и Paths из пакета «java.nio.file». Но о каком методе вы говорите? – Thorsten

+0

Я исправил свой ответ некоторым примером кода. – eggheadmike

+0

Большое спасибо за ваши расследования и ваш подробный ответ.Я попробовал небольшой пример вашего кода с docRoot \\ server \ c $ \ Windows, c: \ Windows, U: \, и он завершился неудачей с исключением на последнем. Также обратите внимание, что я хотел бы сохранить корневой каталог как «server/c $», «c:» или «u:», чтобы быть видимым в моем пути назначения. См. Мой пример в моем вопросе. – Thorsten