|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"SFNとLFNをそれぞれ求める"
FAQに Kennywell さんがアップされていた同様の関数を使っていたの
ですが もう少しシンプルにできそうだったのでやってみました。
【使用例】
program test;
{$APPTYPE CONSOLE}
begin
//使用例もナニもないですが(^^;
Writeln(
GetLongFullPathName(
GetShortFullPathName(
'C:\WINDOWS\スタート メニュー'
)
)
);
end.
-------------------------------------------------------------------
function PutYenMark(Dir: string): string;
begin
try
if Dir[length( Dir )]='\' then Result := Dir
else Result := Dir+'\';
except
Result := '';
end;
end;
function TailLongName(FullPathName: String): String;
(* LFNに変換した FullPathName 末尾のファイル/フォルダ名のみを返す
ファイル/フォルダが存在しない場合はそのまま返す *)
var
SearchRec : TSearchRec;
begin
// FullPathName を FindFirst する
if FindFirst( FullPathName, faAnyFile-faVolumeID, SearchRec )=0 then
//見つかった
Result := SearchRec.Name
else
//見つからない時は末尾をそのまま返す
Result := ExtractFileName( FullPathName );
FindClose( SearchRec );
end;
function GetLongFullPathName(ShortFullPath:String): String;
(* ShortFullPath をLFNに変換
ファイル/フォルダが存在しない場合は渡されたパス名をそのまま返すので
存在チェックはユーザー側で行うこと *)
begin
//もしもルートドライブならパス名をそのまま返す(無限再帰防止)
if Length( ShortFullPath )<4 then begin
Result := AnsiUpperCase( ShortFullPath );
Exit;
end;
Result := PutYenMark(
// ShortFullPath のフォルダ名部分を再帰にかけていく
GetLongFullPathName( ExtractFileDir( ShortFullPath ) )
)+
//再帰が終わったら末尾をつける
TailLongName( ShortFullPath );
end;
function TailShortName(FullPathName: String): String;
(* SFNに変換した FullPathName 末尾のファイル/フォルダ名のみを返す
ファイル/フォルダが存在しない場合はそのまま返す *)
var
SearchRec : TSearchRec;
Tail : string;
begin
// FullPathName を FindFirst する
if FindFirst( FullPathName, faAnyFile-faVolumeID, SearchRec )=0 then begin
//見つかった
Tail := SearchRec.FindData.cAlternateFileName;
// SFN と LFN が同じ場合は cAlternateFileName がヌルになる
if Tail='' then
Tail := SearchRec.Name;
end else
//見つからない時は末尾をそのまま返す
Tail := ExtractFileName( FullPathName );
Result := Tail;
FindClose( SearchRec );
end;
function GetShortFullPathName(LongFullPath: String): String;
(* LongFullPath をSFNに変換
ファイル/フォルダが存在しない場合は渡されたパス名をそのまま返すので
存在チェックはユーザー側で行うこと *)
begin
//もしもルートドライブならパス名をそのまま返す(無限再帰防止)
if Length( LongFullPath )<4 then begin
Result := AnsiUpperCase( LongFullPath );
Exit;
end;
Result := PutYenMark(
// LongFullPath のフォルダ名部分を再帰にかけていく
GetShortFullPathName( ExtractFileDir( LongFullPath ) )
)+
//再帰が終わったら末尾をつける
TailShortName( LongFullPath );
end;
-------------------------------------------------------------------
(PXC07042) - とらじ -
Original document by 寅次 氏 ID:(PXC07042)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|