お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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