Приведение относительного пути к абсалютному
Добавлено: 28.12.2013 19:36:58
Доброго времени суток!
Задача написать функцию (назовем convertpath), которая на входе получает путь в любом виде. Задача функции выдать на выходе полный путь.
Например текущий каталог /var/logs.
Тогда:
path := convertpath('~') // функция возвращает /home/user
path := convertpath('~/.config') // функция возвращает каталог /home/user/.config
path := convertpath('.') // функция возвращает каталог /var/logs
path := convertpath('.config') // функция возвращает каталог /var/logs/.config
path := convertpath('..') // функция возвращает каталог /var
path := convertpath('../..') // функция возвращает каталог /
path := convertpath('../lock') // функция возвращает каталог /var/lock
path := convertpath('../lock') // функция возвращает каталог /var/lock
path := convertpath('/run/media') // функция возвращает каталог /run/media
path := convertpath('/') // функция возвращает каталог /
и т.д.
HINT: Функия нужна для игры, поэтому на систему не оперешься.
Принципе, этот велосипед я уже почти изобрел(код ниже), однако :
1) если кто-то еще изобретал подобное - давайте сравним код? Мой велосипед едет вполне уверенно, но он не идеален, а хочется лоска.
2) или находил подобный код в интернете - подскажите где.
Задача написать функцию (назовем convertpath), которая на входе получает путь в любом виде. Задача функции выдать на выходе полный путь.
Например текущий каталог /var/logs.
Тогда:
path := convertpath('~') // функция возвращает /home/user
path := convertpath('~/.config') // функция возвращает каталог /home/user/.config
path := convertpath('.') // функция возвращает каталог /var/logs
path := convertpath('.config') // функция возвращает каталог /var/logs/.config
path := convertpath('..') // функция возвращает каталог /var
path := convertpath('../..') // функция возвращает каталог /
path := convertpath('../lock') // функция возвращает каталог /var/lock
path := convertpath('../lock') // функция возвращает каталог /var/lock
path := convertpath('/run/media') // функция возвращает каталог /run/media
path := convertpath('/') // функция возвращает каталог /
и т.д.
HINT: Функия нужна для игры, поэтому на систему не оперешься.
Принципе, этот велосипед я уже почти изобрел(код ниже), однако :
1) если кто-то еще изобретал подобное - давайте сравним код? Мой велосипед едет вполне уверенно, но он не идеален, а хочется лоска.
2) или находил подобный код в интернете - подскажите где.
- Код: Выделить всё
function convertpath(const comp, dir : string) : string; //comp - имя компьютера, dir - значение для конвертации
var s, s2, ch, pl : string;
n : integer;
begin
result := dir;
pl := gk_GetPlatform(comp); // узнаем платформу компа : виньда или юникс
if pl = 'unix'
then ch := '/'
else ch := '\';
if pl = 'unix'
then begin
if (dir = '.')or(dir = './')
then result := gk_curdir(comp) // текущий каталог
else
if dir = '~'
then result := gk_homecurdir(comp) // домашний каталог
end;
if dir = '..'
then begin
result := gk_curdir(comp) // текущий каталог
if pl = 'windows'
then begin
if length(result) > 3 //игнорируем имена диском c: d: и т.д.
then begin
delete(result,length(result),1);
result := extractfilepath(result);
end;
end
else begin
if result = '/'
then
else begin
delete(result,length(result),1);
result := extractfilepath(result);
end;
end
end
else begin
if length(result) > 0 then
if (result[length(result)] = '/')and(result <> '/')
then delete(result,length(result),1);
s := extractfilename(result);
s2 := extractfilepath(result);
if (s2 = '')or(s2 = '.')or(s2 = './')
then begin
s2 := gk_curdir(comp);
result := s2 + s;
end;
if (system.pos('/',result) > 1)
then result := gk_curdir(comp) + result;
end;
if length(result) > 0 then
if (result[length(result)] <> ch) then result := result + ch;
end;