|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
ファイルの短い名前:エイリアス(標準8.3形式)のフルパス名を、長い名前
のフルパス名にするにはどうすればいいですか?
[A]
この必要に遭遇するのは、ファイルをエクスプローラなどからDrag&Dropし
て、ParamStr(i)に収めたときでしょう。例えば次のようになっています:
ParamStr(1)=
'E:\PROGRA~1\BORLAND\DELPHI~1.0\BIN\BORLAN~1.0\DELPHI~1.LNK'
このとき、
FindFirst(ParamStr(1),faAnyFile,SearchRec)
で、SearchRec にファイルあるいはディレクトリー(ここではファイル)が
捕捉され、SearchRec.Name には、ロング名が入ります(TJIN さんより:
SBORLAND MES 16 '' )。ただし、パスは含みません:
SearchRec.Name='Delphi 2.0.lnk';
この原理を使い、ディレクトリー名は再帰で求めたのが、以下の例です。
[例]
{=======================================================}
function TailLongName(FullPathName: String; Attr: integer): String;
var
SearchRec: TSearchRec;
begin
if FindFirst(FullPathName,Attr,SearchRec)=0 then
Result:=SearchRec.Name
else
Result:='';
FindClose(SearchRec);
end; {TailLongName}
{=======================================================}
function GetLongDirName(DirName:String): String;
var
LongDirName: String;
begin
if Length(Dirname)=3 then
Result:=Dirname
else begin
LongDirName:=
TailLongName(DirName,faDirectory+faHidden+faSysFile);
DirName:=ExtractFileDir(DirName);
Result:=PutYenMark(GetLongDirName(Dirname))+LongDirName;
end;
end; {GetLongDirName}
{=======================================================}
function GetLongFullPathName(ShortFullPath:String): String;
{ShortFullPathはディレクトリー名でもよい}
Var
aDir: String;
begin
aDir:=GetLongDirName(ExtractFileDir(ShortFullPath));
if ExtractFilename(ShortFullPath)='' then
Result:=aDir
else
Result:=PutYenMark(aDir)+
TailLongName(ShortFullPath,faAnyfile);
end; {GetLongFullPathName}
{=======================================================}
function PutYenMark(vDir: String): String;
{末端に'\'がないとき、付加した文字列を返す。ある時はそのまま返す。
>#73 [FAQ]ディレクトリ名をリネームする、など参照}
【注意】
●FileNameが、ディレクトリーでもファイル名でもないとき
GetLongFullPathName(FileName)を呼ぶと、破綻します。従って、
DirectoryExists や、FileExists で確かめてから使うと安全です(短い名前
でも使えるんですね!)。
●上の例を使うと、
GetLongFullPathName(ParamStr(1))=
'E:\Program Files\Borland\Delphi 2.0\BIN\Borland Delphi 2.0 Delphi 2.0.lnk';
となります。
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|