Contributor: PETER GEDECK 
{
bcp100@cd4680fs.rrze.uni-erlangen.de (Peter Gedeck)
: Does anyone have a relative path routine? An example of what I mean by a
: relative path routine is the Turbo Pascal IDE's editor window titles. It
: only displays as much of the files path name as is necessary. It should be
: something like
: function RelativePath(FullPath: string): string;
This is what I use to get a relative file name. I think it works correctly
and hope you will find it useful.
}
Uses
 Dos;
function GetCurDir : DirStr;
var
 CurDir : DirStr;
begin
 GetDir(0, CurDir);
 GetCurDir := CurDir;
end;
function GetCurDrive : Char; assembler;
asm
 MOV AH,19H
 INT 21H
 ADD AL,'A'
end;
function GetRelativeFileName(F : String) : String;
var
 D : DirStr;
 N : NameStr;
 E : ExtStr;
 i : integer;
 rd : string;
begin
 F := FExpand(F);
 FSplit(F, D, N, E);
 if GetCurDrive = D[1] then
 begin
 { Same Drive - remove Driveinformation from D }
 Delete(D, 1, 2);
 F := GetCurDir + '\';
 Delete(F, 1, 2);
 { Maybe it is a file in a directory higher than the actual directory }
 i := Pos(F, d);
 if i> 0 then
 Delete(d, 1, length(F))
 else
 begin
 rd := '';
 if Pos(d, F) = 0 then
 repeat
 repeat
 rd := d[Ord(d[0])] + rd;
 dec(d[0]);
 until d[Ord(d[0])] = '\';
 until Pos(d, F)> 0;
 { Maybe it is a file in a directory lower than the actual directory }
 if Pos(d, F)> 0 then
 begin
 repeat
 rd := '..\' + rd;
 dec(F[0]);
 while F[Ord(F[0])]  '\' do
 dec(F[0]);
 until (Pos(d, F)> 0) and not ((d = '\') and (F  '\'));
 d := rd;
 end;
 end;
 end;
 GetRelativeFileName := (D + N + E);
end;
begin
 Writeln(GetRelativeFileName('C:\qmpro\dl\bp\lib\ansi.pas'));
end. 

AltStyle によって変換されたページ (->オリジナル) /