Главная страница
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.49 MB
Время: 0.08 c
14-1125469580
12DFBDDh
2005-08-31 10:26
2005.09.25
Кодовая страница cp866


14-1125430963
iZEN
2005-08-30 23:42
2005.09.25
Checked-exceptions, добро или зло?


3-1123757311
Marat
2005-08-11 14:48
2005.09.25
Долгий поиск


14-1125844158
Saint-Virus
2005-09-04 18:29
2005.09.25
Про спутниковый интернет


4-1122901119
Андрей Молчанов
2005-08-01 16:58
2005.09.25
FindWindowEx