2014-03-14 4 views
1

Преобразования относительного пути foo относительно опорной точки bar в абсолютном путь baz может быть сделано:Преобразование абсолютного пути к относительной одной

baz = File.expand_path(foo, bar) 

Как противоположность это может быть сделана? Другими словами, с учетом абсолютного пути baz и контрольной точки bar (данный как абсолютный путь), как его можно преобразовать в относительный путь foo, как показано ниже?

foo = File.relative_path(baz, bar) 

Пожалуйста, предположим, что все приведенные пути нормализуются в том смысле, что они не заканчиваются / в случае, если они являются каталоги:

"/foo/bar" 
"/foo/bar/" # No need to consider 

и то же самое относится и ко всем вернувшихся путям.

Обратите внимание, что это не так тривиально, как избавление от bar из начальной части baz и заменить его ./, потому что baz не обязательно является потомок bar. В общем, ряд ../ должен быть уложен в штабель для достижения общего предка.

Примеры включают, но не ограничиваются ими:

File.relative_path("/foo/bar/quex", "/foo") # => "bar/quex" (preferred) or 
              # "./bar/quex" 
File.relative_path("/foo", "/foo/bar") # => "../" 
File.relative_path("/foo/bar", "/baz/quex") # => "../../foo/bar" 
+0

Woww .. Какая мысль .. +1 –

+1

Это произошло по необходимости, это не только для любопытства. :) – sawa

+1

hehe ... Still .. * Wooww * .. вы этого заслуживаете. Было бы хорошо, я думаю, подумать обо мне: если вы действительно даете реальный путь в качестве примера. Чтобы мы могли визуализировать ваши потребности. –

ответ

3

Я считаю Pathname#relative_path_from является то, что вы ищете. См. this answer Я дал другой вопрос.

require 'pathname' 

first = Pathname.new '/first/path' 
second = Pathname.new '/second/path' 

relative = second.relative_path_from first 
# ../../second/path 

first + relative 
# /second/path 
+1

Спасибо. Это помогло. Просто для будущих ссылок на других: 'to_s' следует применять к результату. – sawa

Смежные вопросы