![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Относительный путь к файлу
Viktop © (2005-08-18 18:59:00)Как можно узнать относительный путь файла от исполняемого файла.
Исполняемый файл находится в папке 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
Вроде так должно быть. Может функция какя есть стандартная?
Джо (2005-08-19 10:04:00) [1]
> [8] Viktop (19.08.05 06:43)
> Добился, чтобы строил с выбранной папки.
Мои поздравления.
Viktop (2005-08-19 06:43:00) [2]Поиск есть, только он строит дерево по полному пути (C:\...)
Добился, чтобы строил с выбранной папки.
Джо (2005-08-19 05:55:00) [3]А вообще, судя по описанной задаче, тебе нужно совсем не то. А (рекурсивный) поиск в дереве каталогов.
Джо (2005-08-19 05:52:00) [4]
> [5] Viktop (19.08.05 05:41)
> Она у менячто-то не то выдаёт. Как использовать надо?
ShowMessage(
ExtractRelativePath('c:\progam\','c:\1.txt'));
// или
ShowMessage(
ExtractRelativePath('c:\progam\','c:\progam\inner\1.txt'));
Viktop (2005-08-19 05:41:00) [5]to RusLAN
В папке с экзегником ещё несколько вложенных папко. Выбираем одну из них (любой уровень вложения) и строится дерево
выбранная папка
файлы
папки
А в свойство Data записывается путь от папки с экзешником
to Джо
Она у менячто-то не то выдаёт. Как использовать надо?
Джо (2005-08-19 01:54:00) [6]Есть такая функция
ExtractRelativePath. Находится в SysUtils.
Antonn (2005-08-18 20:02:00) [7]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?
TStas (2005-08-18 19:52:00) [8]Первая функция нужна, чтобы рассыпать в массив путь
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
RusLAN_ (2005-08-18 19:40:00) [9]Стандартной ИМХО нет.
Надо "вычесть" короткий путь из длинного
если короткий путь - это путь к прораме, то то что останется будет относительным путем к файлу
если короткий путь - это путь к файлу то в том что останется надо заменить имена каталогов двумя точками (получим чтото типа ..\..\2.тхт)
это все при условии что один путь обязательно содержит второй.
а для чего такая задача, может конечного результата можна достичь и без решения этой проблемы.