お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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