Текущий архив: 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.061 c