如何获得一个相对于基本路径的相对路径的绝对路径?(200分)

  • 主题发起人 主题发起人 mally
  • 开始时间 开始时间
M

mally

Unregistered / Unconfirmed
GUEST, unregistred user!
题目可能有点绕,举例如下:
现有一个相对路径 path1 := '../map/a.txt' ,
一个基本路径 path2 := 'C:/dat/mytxt/b.txt'
如何求得path1 相对于 path2 的绝对路径(应该是'C:/dat/map/a.txt')?
好像没有这样的函数的。有没有谁有通用算法?
 
ExpandFileName
以下是渔:
ExtractFilePath, ExtractFileName, ExtractFileExt经常用
看看SysUtils.pas肯定有
 
ExtractFilePath(Path2) + Path1 就可以了.
 
var
s: string;
begin
s:=ExtractFilePath(Application.ExeName);
s:=s+'../Lib';
s:=ExtractFilePath(s);
showmessage(s);
end;
 
我常用的几个自写的字符串处理函数
unit StrSub;

interface
uses
windows, SysUtils, StrUtils;

function StrToUrlStr(s:String):string;

//获取SubStr在Str中左边的部分字符串,从左起搜索
function GetLeftStr(SubStr, Str: string): string;

//获取SubStr在Str中右边的部分字符串,从左起搜索
function GetRightStr(SubStr, Str: string): string;

//获取SubStr在Str中左边的部分字符串,从右起搜索
function GetLeftEndStr(SubStr, Str: string): string;

//获取SubStr在Str中右边的部分字符串,从右起搜索
function GetRightEndStr(SubStr, Str: string): string;


implementation
function GetLeftStr(SubStr, Str: string): string;
begin
Result := Copy(Str, 1, Pos(SubStr, Str) - 1);
end;
//-------------------------------------------
function GetRightStr(SubStr, Str: string): string;
var
i: integer;
begin
i := pos(SubStr, Str);
if i > 0 then
Result := Copy(Str, i + length(substr), length(Str))
else
Result := '';
end;
//---------------------------------------------
function GetLeftEndStr(SubStr, Str: string): string;
var
i: integer;
S: string;
begin
S := Str;
Result := '';
repeat
i := Pos(SubStr, S);
if i > 0 then
begin
if Result <> '' then
Result := Result + SubStr + GetLeftStr(SubStr, S)
else
Result := GetLeftStr(SubStr, S);

S := GetRightStr(SubStr, S);
end;
until i <= 0;
end;
//-------------------------------------------

function GetRightEndStr(SubStr, Str: string): string;
var
i: integer;
begin
Result := Str;
repeat
i := Pos(SubStr, Result);
if i > 0 then
begin
Result := GetRightStr(SubStr, Result);
end;
until i <= 0;
end;
//-------------------------------------------

在以上几个函数的基础上解决楼主的问题
path2 := 'C:/dat/mytxt/b.txt';
path1 := '../map/a.txt'
function GetPath(path1,path2:string):string;
var
ts : string;
Begin
result:= GetLeftEndStr('/',path2);
While path1<>'' do
BEGIN
if Pos('/',path1)>0 then
begin
ts := GetLeftStr('/',path1);
path1 := GetRightStr('/',path1);
end
begin
ts := path1 ;
path1 := '';
end;

if ts='..' then
result:= GetLeftEndStr('/',result)
else if ts ='.' then continute
else
begin
result:= result+ '/' +ts;
end;
end;

我不知道有没有现成的函数,呵呵,手写的,没有测试过.
ExtractFilePath(Path2) + Path1 会得到下面的结果
'C:/dat/mytxt/../map/a.txt'
这个执行大部分操作还是没什么问题的,不过好像有些用这样的路径会出错
 
既然晚起的小虫已经得出'C:/dat/mytxt/../map/a.txt' 了,就再加上几句,判断两个/号中的..,就把..自己和前面一个夹在/之间的文件夹删除,就自然得出最后的正确结果了,这样很困难吗?
 
如果硬盘中没有'C:/dat/map/a.txt'.什么算法都是空
 
ExtractFilePath(Path2) + Path1就可以了啊
 
昨天的例子用错了函数,可以用
ExpandFileName
 
后退
顶部