短いファイル名を長いファイル名に変換したい。
|
長いファイル名を短いファイル名にするのは、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版があります。 |
|