|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"相対パスから絶対パスへ変換"
相対パスから絶対パスのファイル名へ変換します。ちょうど
ExtractRelativePath 関数の逆の働きをします。
例えば ExtractFullPath('C:\Windows\System', '..\Media') とすると
"C:\Windows\Media\" が返されます。
しかし、なぜこの関数が Delphi に入ってないんでしょうね。
// BaseName : ベースとなる絶対パス
// SrcName : 変換したい相対パス
function ExtractFullPath(const BaseName, SrcName: string): string;
function AddFirstSlash(const Str: string): string;
begin
Result := Str;
if Copy(Result, 1, 1)<>'\' then
Result := '\' + Result;
end;
function DeleteFirstSlash(const Str: string): string;
begin
Result := Str;
if Copy(Result, 1, 1)='\' then
Result := Copy(Result, 2, MaxInt);
end;
function AddBackSlash(const Str: string): string;
begin
Result := Str;
if (Result<>'') and (Result[Length(Result)]<>'\') then
Result := Result + '\';
end;
function ExtractFullPath2(const RelativePath: string): string;
var
SrcPath: string;
SrcDirs: array[0..129] of PChar;
SrcDirCount: Integer;
procedure SplitDirs(var Path: string; var Dirs: array of PChar;
var DirCount: Integer);
var
I, J: Integer;
begin
I := 1;
J := 0;
while I <= Length(Path) do
begin
if Path[I] in LeadBytes then Inc(I)
else if Path[I] = '\' then { Do not localize }
begin
Path[I] := #0;
Dirs[J] := @Path[I + 1];
Inc(J);
end;
Inc(I);
end;
DirCount := J - 1;
end;
var
i: Integer;
DriveName: string;
begin
Result := '';
DriveName := ExtractFileDrive(RelativePath);
SrcPath := Copy(RelativePath, Length(DriveName)+1, MaxInt);
SplitDirs(SrcPath, SrcDirs, SrcDirCount);
for i:=0 to SrcDirCount do
begin
if SrcDirs[i]='.' then
else if SrcDirs[i]='..' then
Result := ExtractFileDir(Result)
else begin
Result := AddBackSlash(Result) + SrcDirs[i];
end;
end;
Result := DriveName + AddFirstSlash(Result);
end;
begin
if ExtractFileDrive(SrcName)<>'' then
begin
{ SrcName にドライブ名が指定されているので BaseName は無視 }
Result := AddBackSlash(ExtractFullPath2(SrcName));
end else
begin
Result := ExtractFullPath2(AddBackSlash(BaseName)+
DeleteFirstSlash(SrcName));
end;
end;
堀 浩行(Hiroyuki Hori)
E-Mail: hori@www.ingjapan.ne.jp
Homepage: http://www.ingjapan.ne.jp/hori/
Original document by 堀 浩行 氏 ID:(BXI05470)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|