Delphi Tips 
-----------------------------

0233  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/03 西坂良幸 rev 1.6
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/27 西坂良幸 編集
短いファイル名を長いファイル名に変換したい。

長いファイル名を短いファイル名にするのは、APIにGetShortPathNameという関数があるで簡単ですが([Tips:68])、逆の長いファイル名にするのはちょっと工夫が必要です。

APIのFindFirstFile関数を使うとパラメータのWIN32_FIND_DATA構造体のcAlternateFileNameに短いファイル名あり、長いファイル名はcFileNameにあります。
したがって、長い→短い、短い→長いの変換は基本的には、ファイル名を使ってもう一度FindFirstしてやればいいわけです。

効率を無視すれば次のようものでしょうか。
この関数ではドライブレターの大文字小文字は変換されませんので、必要であれば後から大文字に変換してください。

function ShortToLongFileName(ShortName: String):String;
var
  SearchRec: TSearchRec;
begin
  result:= '';
  // フルパス化
  ShortName:= ExpandFileName(ShortName);
  // 長い名前に変換(ディレクトリも)
  while LastDelimiter('\', ShortName) >= 3 do begin
    if FindFirst(ShortName, faAnyFile, SearchRec) = 0 then
      try
        result := '\' + SearchRec.Name + result;
      finally
        // 見つかったときだけ Close -> [Delphi-ML:17508] を参照
        FindClose(SearchRec);
      end
    else
      // ファイルが見つからなければそのまま
      result := '\' + ExtractFileName(ShortName) + result;
    ShortName := ExtractFilePath(ShortName);
    SetLength(ShortName, Length(ShortName)-1); // 最後の '\' を削除
  end;
  result := ShortName + result;
end;

[Tips:273]に同様の結果を得るCOM版があります。
参照: [Delphi-ML:3333] [Delphi-ML:7320] [Delphi-ML:7322] [Delphi-ML:17508] [Tips:68] [Tips:273] <ファイル>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp