2017-01-24 38 views
2

ファイルがフォルダであるかどうかを取得するためにPItemIDListからDelphiとWindows APIを使用することは可能ですか?このコードスニペットを使用すると、ファイルの名前だけを取得できます。相対PIDL用DelphiのWindowsを使用してファイル情報を取得するapi

procedure TMain.FolderMonitorFileChange(aSender: TObject; aPIDL: PItemIDList); 
var 
    FileInfo : SHFILEINFOW; 
begin 
    SHGetFileInfo(LPCTSTR(aPIDL), 0 , FileInfo, SizeOf(FileInfo), SHGFI_PIDL or SHGFI_DISPLAYNAME or SHGFI_TYPENAME or SHGFI_ATTRIBUTES); 
    ShowMessage('File change notification: ' + FileInfo.szDisplayName + ' ' + FileInfo.szTypeName); 
end; 

おかげ

+0

あなたはhttp://stackoverflow.com/questions/3780028/how-can-i-get-the-description-of-a-file-extension-in-net –

+0

@を見てきましたポール彼はファイルではなくPIDLを持っています –

+0

'IShellFolder :: GetAttributesOf'を呼び出し、' SFGAO_FOLDER'をチェックします。 –

答えて

4

、あなたはPIDLの親フォルダのIShellFolderインタフェースを取得し、その後IShellFolder::GetAttributesOf()方法にPIDLを渡すことができます。絶対PIDL用

function IsFolder(Parent: IShellFolder; aChildPIDL: PItemIDList): Boolean; 
var 
    Attrs: SFGAOF; 
begin 
    Result := Succeeded(Parent.GetAttributesOf(1, @aChildPidl, @Attrs)) 
    and (Attrs and SFGAO_FOLDER <> 0); 
end; 

、あなたはいくつかの異なるオプションがあります。

  • IShellFolder::GetAttributesOf()を呼び出し、その後、相対PIDLに変換し、その親フォルダのIShellFolderを取得するためにSHBindToParent()にPIDLを渡します。

    function IsFolder(aPIDL: PItemIDList): Boolean; 
    var 
        Parent: IShellFolder; 
        Child: PItemIDList; 
        Attrs: SFGAOF; 
    begin 
        Result := Succeeded(SHBindToParent(aPidl, IShellFolder, @Parent, @Child)) 
        and Succeeded(Parent.GetAttributesOf(1, @Child, @Attrs)) 
        and (Attrs and SFGAO_FOLDER <> 0); 
    end; 
    
  • SHGFI_PIDLフラグを使用SHGetFileInfo()にPIDLを渡します。アイテムの属性を要求するには、SHGFI_ATTRIBUTESフラグを有効にします。

    function IsFolder(aPIDL: PItemIDList): Boolean; 
    var 
        FileInfo : SHFILEINFO; 
    begin 
        Result := (SHGetFileInfo(LPCTSTR(aPIDL), 0, @FileInfo, SizeOf(FileInfo), SHGFI_PIDL or SHGFI_ATTRIBUTES) <> 0) 
        and (FileInfo.dwAttributes and SFGAO_FOLDER <> 0); 
    end; 
    
  • はそれのためIShellItemインタフェースを取得するためにSHCreateItemFromIDList()にPIDLを渡し、そのIShellItem::GetAttributes()を呼び出します。

    function IsFolder(aPIDL: PItemIDList): Boolean; 
    var 
        Item: IShellItem; 
        Attrs: SFGAOF; 
    begin 
        Result := Succeeded(SHCreateItemFromIDList(aPidl, IShellItem, @Item)) 
        and Succeeded(Item.GetAttributes(SFGAO_FOLDER, @Attrs)) 
        and (Attrs and SFGAO_FOLDER <> 0); 
    end; 
    
+0

助けてくれてありがとうございますが、このイベントが私に監視されたフォルダのファイル変更を返し、ファイルが変更されたときにすべてが正常ですが、ファイルを作成すると、それが変更されたことを含み、属性がそれがファイルであると言う場合、型名は 'file'と表示され、displayNameはフォルダの名前です。 – Plebios

+2

PIDLがフォルダまたはファイルを表すかどうかを確認する方法を尋ねました。私はそれに答えた。 'SFGAO_FOLDER'属性はそのために特別に設計されています。さて、あなたは別の問題を説明しています。通知があなたにファイルPIDLまたはフォルダPIDLを与えるかどうかは、あなたが実際に監視しているものとそれをどのように監視しているかによって異なります。しかし、フォルダーオブジェクトが属性のフォルダーとして自分自身を報告しないということは非常に疑問です。コードにバグがあると思われたり、処理していないとエラーが報告されたりします。 –

+0

はい私はこれを尋ねました。コードでわかるように、イベントの「PItemIDList」を受け取ったので、そのオブジェクトのデータを抽出する方法がわからないからだと思いました。私は 'TLMDShellNotify'を使ってフォルダを監視し、このオブジェクトの 'FileChange'イベントを使って変更を受け取ります。 – Plebios

関連する問題