Приведение относительного пути к абсалютному

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Приведение относительного пути к абсалютному

Сообщение minoshi » 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) или находил подобный код в интернете - подскажите где.

Код: Выделить всё
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;
Аватара пользователя
minoshi
постоялец
 
Сообщения: 279
Зарегистрирован: 17.05.2008 21:23:38

Re: Приведение относительного пути к абсалютному

Сообщение mse » 30.12.2013 00:53:48

Check the functions in lib/kernel/msefileutils.pas, especially filepath().
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru
cron