Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

Относительный путь к файлу   Найти похожие ветки 

 
Viktop   (2005-08-18 18:59) [0]

Как можно узнать относительный путь файла от исполняемого файла.
Исполняемый файл находится в папке c:\proga\super\project.exe
А файл, до которого нужного вывести относительный путь в папке
1) c:\proga\super\files\file1\1.txt
2) c:\proga\2.txt
В 1 варианте должно получиться file1\1.txt
во 2м - ..\2.txt
Вроде так должно быть. Может функция какя есть стандартная?


 
RusLAN_   (2005-08-18 19:40) [1]

Стандартной ИМХО нет.

Надо "вычесть" короткий путь из длинного
если короткий путь - это путь к прораме, то то что останется будет относительным путем к файлу
если короткий путь - это путь к файлу то в том что останется надо заменить имена каталогов двумя точками (получим чтото типа ..\..\2.тхт)

это все при условии что один путь обязательно содержит второй.

а для чего такая задача, может конечного результата можна достичь и без решения этой проблемы.


 
TStas ©   (2005-08-18 19:52) [2]

Первая функция нужна, чтобы рассыпать в массив путь
function splitToTStringList(s1, s2:String):TStringList;
var
  i, ln:Integer;
  s:String;

begin
Result:=TStringList.Create;
if s2="" then //Если пустая строка, вернуть массив символов
  begin
  for i:=1 to Length(s1) do Result.Add(s1[i]);
  exit;
  end;
ln:=Length(s2);
while (Pos(s2, s1)<>0) do
begin
i:=Pos(s2, s1);
s:=Copy(s1, 1, i-1);
Delete(s1, 1, i+ln-1);
Result.Add(s);
end;

Result.Add(s1);
end;

{Принимает относительный путь, как его на HTML пишут, возвращает абсолютный}
function RelativePath(const p1, p2:String):String;
var
 i, m:Byte;
 list1, list2:TStringList;
begin
List1:=splitToTStringList(p1, "\");
List2:=splitToTStringList(p2, "\");
list1.Delete(List1.Count-1); //Стираю в списке имя самого файла
if List1.Count<List2.Count then m:=List1.Count
else m:=List2.Count;
Result:="";
for i:=0 to m-1 do
 begin
 if List1[0]=List2[0] then
   begin
   list1.Delete(0);
   List2.Delete(0);
   //ShowMessage(List1.Text+#13#10+List2.Text);
   end
 else break;
 end;
if list1.Count>0 then for i:=0 to list1.Count-1 do Result:=Result+"../"; //Папки, на которые надо подняться

for i:=0 to list2.Count-1 do
 begin
 Result:=Result+list2[i];
 if i<>list2.Count-1 then Result:=Result+"/";
 end;
List1.Free;
List2.Free;
end;

Вот и передать ей Application.ExeName


 
Antonn ©   (2005-08-18 20:02) [3]

Viktop   (18.08.05 18:59)
1) c:\proga\super\files\file1\1.txt
2) c:\proga\2.txt
В 1 варианте должно получиться file1\1.txt

а не files\file1\1.txt?


 
Джо ©   (2005-08-19 01:54) [4]

Есть такая функция ExtractRelativePath. Находится в SysUtils.


 
Viktop   (2005-08-19 05:41) [5]

to RusLAN
В папке с экзегником ещё несколько вложенных папко. Выбираем одну из них (любой уровень вложения) и строится дерево
выбранная папка
файлы
папки
А в свойство Data записывается путь от папки с экзешником

to Джо
Она у менячто-то не то выдаёт. Как использовать надо?


 
Джо ©   (2005-08-19 05:52) [6]


>  [5] Viktop   (19.08.05 05:41)
> Она у менячто-то не то выдаёт. Как использовать надо?


 ShowMessage(
   ExtractRelativePath("c:\progam\","c:\1.txt"));

 // или

 ShowMessage(
   ExtractRelativePath("c:\progam\","c:\progam\inner\1.txt"));


 
Джо ©   (2005-08-19 05:55) [7]

А вообще, судя по описанной задаче, тебе нужно совсем не то. А (рекурсивный) поиск в дереве каталогов.


 
Viktop   (2005-08-19 06:43) [8]

Поиск есть, только он строит дерево по полному пути (C:\...)
Добился, чтобы строил с выбранной папки.


 
Джо ©   (2005-08-19 10:04) [9]


>  [8] Viktop   (19.08.05 06:43)
> Добился, чтобы строил с выбранной папки.

Мои поздравления.



Страницы: 1 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.039 c
2-1124377170
Viktop
2005-08-18 18:59
2005.09.25
Относительный путь к файлу


14-1125646228
ocean
2005-09-02 11:30
2005.09.25
Западный человек законопослушен?


8-1115882168
Vadim68
2005-05-12 11:16
2005.09.25
Как правильно сохранить битмап?


14-1125298599
ПЛОВ
2005-08-29 10:56
2005.09.25
Подскажите, как проверить PHP-скрипты на локальном компьютере?


14-1125169371
Lamer@fools.ua
2005-08-27 23:02
2005.09.25
Угадай мелодию





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский