完全PIDLを使用して IShellFolder.GetAttributesOf で属性を素得すると正しい属性値が取得できない - C#

完全PIDLを使用して IShellFolder.GetAttributesOf で属性を取得すると、正しく属性値が取得できないことがあります。

正しく取得できる場合

  • デスクトップ直下のフォルダ

正しくない値が取得される場合

  • PC(マイコンピュータ)以下のフォルダ

対策

完全PIDLを利用する場合

完全PIDLではなく相対PIDLを利用して一つ上位のフォルダのIShellFolderのGetAttributesOf メソッドを利用して属性を取得すると正しい属性値が取得できるようです。
もしくはSHGetFileInfo() APIを利用すれば、完全PIDLから正しい属性値が取得できます。

ファイルパスから属性を取得する場合

IShellFolder.ParseDisplayName() メソッドでPIDLを取得し、取得したPIDLを利用して、IShellFolder.GetAttributesOf() を呼び出すと正しい属性が取得できないことがあります。
この場合は、IShellFolder.ParseDisplayName() メソッド呼び出し時の第6引数のOutを利用すると正しい属性値が取得できます。

または、一つ上位のフォルダのIShellFolderを取得し、そのIShellFolderのParseDisplayName()メソッドに相対パスを与えて取得したPIDLを利用してIShellFolder.GetAttributesOf() を呼び出すと正しい属性値が取得できますが、ParseDisplayName()メソッドに相対パスを与えるのは本来の仕様では許可されていないため、あまりお勧めできません。

補足

上記の方法で正しく属性を取得できるようになった場合、大きなサイズ(100MB以上)、ファイル数の多い(1000ファイル以上)のZIPファイルの属性取得で時間がかかる場合があります。もしくはタイムアウトして例外が戻る場合があります。
詳細は「サイズの大きいZIPファイルの属性をIShellFolder.GetAttributesOf やSHGetFileInfo で取得すると時間がかかる」の記事を参照してください。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2015-06-05
iPentec all rights reserverd.