GetDetailsOfでファイルプロパティを取得する

クライアントからファイルのプロパティを取得したいという要望があったため、C#でファイルプロパティを取得する際の備忘録です。

Shell32を参照してGetDetailsOfでプロパティを取得する

まず、Shell32を参照追加します。

ソリューションエクスプローラーの参照設定→参照に追加を選択します。

COMタブより、Microsft Shell Controls And Automationを選択します。

Shell32が参照設定に追加されました。

GetDetailsOfでフォルダ直下のファイルプロパティを取得するサンプルです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApp_Sample1
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            String targetFolder = "D:\\test";
            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(targetFolder);
            System.IO.FileInfo[] files = di.GetFiles("*.*");

            Shell32.Shell shell = new Shell32.Shell();

            foreach (System.IO.FileInfo f in files)
            {
                var strFileName = f.FullName;
                Shell32.Folder objFolder = shell.NameSpace(System.IO.Path.GetDirectoryName(strFileName));
                Shell32.FolderItem folderItem = objFolder.ParseName(System.IO.Path.GetFileName(strFileName));

                String filename = objFolder.GetDetailsOf(folderItem, 0);
                Console.WriteLine(filename);
            }
        }
    }
}

この時、GetDatailsOfを呼び出すメソッドに[STAThread]をつけないと、以下のエラーがでます。

「型 ‘System.__ComObject’ の COM オブジェクトをインターフェイス型 ‘Shell32.Shell’ にキャストできません。IID ‘{34936BA1-67AD-4C41-99B8-8C12DFF1E974}’ が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外:0x80004002 (E_NOINTERFACE))」

‘System.__ComObject’ の COM オブジェクトをインターフェイス型 ‘Shell32.Shell’ にキャストできません。のエラーが出たら

モックアップをクライアントに渡してしばらくすると、エラーが出るという連絡がきました。

「System.InvalidCastException: 型 ‘System.__ComObject’ の COM オブジェクトをインターフェイス型 ‘Shell32.Shell’ にキャストできません。IID ‘{286E6F1B-7113-4355-9562-96B7E9D64C54}’ が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外:0x80004002 (E_NOINTERFACE))」

初回に渡したモックアップVer0.1では問題なく、2回目に別途レイアウト等の微修正を行ったモックアップVer0.2でエラーがでるとのこと。

なんだろう、そんなに大きな修正はしていない。問題がなかったver0.1とエラーがでるver0.2では同じファイルを読み込みしているとのこと。クライアントはWindows10。

原因がしばらく分からなかったのですが、調べていくうちに、コンパイルしたWindowsのバージョンの違いによってエラーが出ていることが判明しました。

自分は家ではWindows7で開発をしており、外の持ち出し用PCはWindows10です。Dropboxにソースをおいて両方のPCで開発しているのですが、Windows10でコンパイルしたものはWindows10で動き、Windows7でコンパイルしたものはWindows7で動くということでした。エラーが出ていたモックアップはWindows7でコンパイルしていたので、クライアントのWindow10ではエラーが出ていたのです。

参照設定でShell32の互換性の問題でしょうか、Microsoftさん頼みますよ。ということで動的にShell32を参照するように以下のように変更しました。

GetDetailsOf ファイルプロパティ取得改良版

[STAThread]
static void GetFileProperty2()
{
    String targetFolder = "D:\\test";
    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(targetFolder);
    System.IO.FileInfo[] files = di.GetFiles("*.*");

    var shellAppType = Type.GetTypeFromProgID("Shell.Application");
    dynamic shell = Activator.CreateInstance(shellAppType);

    foreach (System.IO.FileInfo f in files)
    {
        var strFileName = f.FullName;
        Shell32.Folder objFolder = shell.NameSpace(System.IO.Path.GetDirectoryName(strFileName));
        Shell32.FolderItem folderItem = objFolder.ParseName(System.IO.Path.GetFileName(strFileName));

        String filename = objFolder.GetDetailsOf(folderItem, 0);
        Console.WriteLine(filename);
    }
}

Type.GetTypeFromProgID(“Shell.Application”)でShell32の型を動的に取得し、Activator.CreateInstanceでShell32のインスタンスを作成しています。

GetDetailsOf プロパティ一覧

GetDetailsOfで取得できるプロパティ一覧です。
※更新日時などの日時の戻り値は、時間・分までです(例:「2019/‎10/‎06 ‏‎10:55」)。秒まで取得したい場合は、System.IO.FileInfoを使用し、撮影日時については、System.IO.FileInfoで取得できないため、PropertyItemより取得します。取得方法は、写真の撮影日時を秒まで取得するを参照ください。

0 名前
1 サイズ
2 項目の種類
3 更新日時
4 作成日時
5 アクセス日時
6 属性
7 オフラインの状態
8 オフラインで利用可能
9 認識された種類
10 所有者
11 分類
12 撮影日時
13 参加アーティスト
14 アルバム
15
16 ジャンル
17 指揮者
18 タグ
19 評価
20 作成者
21 タイトル
22 件名
23 分類項目
24 コメント
25 著作権
26 トラック番号
27 長さ
28 ビット レート
29 保護
30 カメラのモデル
31 大きさ
32 カメラの製造元
33 会社
34 ファイルの説明
35 プログラム名
36 継続時間
37 オンライン
38 再帰
39 場所
40 任意出席者アドレス
41 任意出席者
42 開催者住所
43 開催者名
44 アラーム時刻
45 必須出席者アドレス
46 必須出席者
47 リソース
48 会議の状態
49 空き時間情報
50 合計サイズ
51 アカウント名
52 進捗状況
53 コンピューター
54 記念日
55 秘書の名前
56 秘書の電話
57 誕生日
58 住所 (会社)
59 市 (会社)
60 国/地域 (会社)
61 私書箱 (会社)
62 郵便番号 (会社)
63 都道府県 (会社)
64 番地 (会社)
65 FAX 番号 (会社)
66 会社のホーム ページ
67 会社電話
68 コールバック番号
69 自動車電話
70 子供
71 会社代表電話
72 部署
73 電子メール アドレス
74 電子メール2
75 電子メール3
76 電子メールの一覧
77 電子メール表示名
78 表題2
79
80 氏名
81 性別
82 名2
83 趣味
84 住所 (自宅)
85 市 (自宅)
86 国/地域 (自宅)
87 私書箱 (自宅)
88 郵便番号 (自宅)
89 都道府県 (自宅)
90 番地 (自宅)
91 自宅 FAX
92 自宅電話
93 IM アドレス
94 イニシャル
95 役職
96 ラベル
97
98 住所 (郵送先)
99 ミドル ネーム
100 携帯電話
101 ニックネーム
102 勤務先所在地
103 住所 (その他)
104 ほかの市区町村
105 他の国/地域
106 他の私書箱
107 他の郵便番号
108 他の都道府県
109 他の番地
110 ポケットベル
111 肩書き
112 市区町村 (郵送先)
113 国/地域
114 私書箱 (郵送先)
115 郵便番号 (郵送先)
116 都道府県
117 番地 (郵送先)
118 プライマリ電子メール
119 通常の電話
120 職業
121 配偶者
122 サフィックス
123 TTY/TTD 電話
124 テレックス
125 Web ページ
126 内容の状態
127 内容の種類
128 取得日時
129 アーカイブ日時
130 完了日
131 デバイス カテゴリ
132 接続済み
133 探索方法
134 フレンドリ名
135 ローカル コンピューター
136 製造元
137 モデル
138 ペアリング済み
139 クラス
140 状態
141 状態
142 クライアント ID
143 共同作成者
144 コンテンツの作成日時
145 前回印刷日
146 前回保存日時
147 事業部
148 ドキュメント ID
149 ページ数
150 スライド
151 総編集時間
152 単語数
153 期限
154 終了日
155 ファイル数
156 ファイル拡張子
157 ファイル名
158 ファイル バージョン
159 フラグの色
160 フラグの状態
161 空き領域
162 共有の種類
163 ビットの深さ
164 水平方向の解像度
165
166 垂直方向の解像度
167 高さ
168 重要度
169 添付
170 削除
171 暗号化の状態
172 フラグの有無
173 終了済
174 未完了
175 開封の状態
176 共有
177 製作者
178 日付時刻
179 フォルダー名
180 フォルダーのパス
181 フォルダー
182 参加者
183 パス
184 場所ごと
185 種類
186 連絡先の名
187 履歴の種類
188 言語
189 最終表示日
190 説明
191 リンクの状態
192 リンク先
193 URL
194 メディアの作成日時
195 リリース日
196 エンコード方式
197 エピソード番号
198 プロデューサー
199 発行元
200 シーズン番号
201 サブタイトル
202 ユーザー Web URL
203 作者
204 添付ファイル
205 BCC アドレス
206 BCC
207 CC アドレス
208 CC
209 会話 ID
210 受信日時
211 送信日時
212 送信元アドレス
213 差出人
214 添付ファイルの有無
215 送信者アドレス
216 送信者名
217 ストア
218 送信先アドレス
219 To do タイトル
220 宛先
221 経費情報
222 アルバムのアーティスト
223 アルバム アーティストで並べ替え
224 アルバム ID
225 アルバムで並べ替え
226 参加アーティストで並べ替え
227 ビート数/分
228 作曲者
229 作曲者で並べ替え
230 イニシャル キー
231 コンパイルの一部
232 雰囲気
233 セットのパート
234 期間
235
236 保護者による制限
237 保護者による制限の理由
238 使用領域
239 EXIF バージョン
240 イベント
241 露出補正
242 露出プログラム
243 露出時間
244 絞り値
245 フラッシュ モード
246 焦点距離
247 35mm 焦点距離
248 ISO 速度
249 レンズ メーカー
250 レンズ モデル
251 光源
252 最大絞り
253 測光モード
254 向き
255 人物
256 プログラムのモード
257 彩度
258 対象の距離
259 ホワイト バランス
260 優先度
261 プロジェクト
262 チャンネル番号
263 この回のタイトル
264 字幕
265 再放映
266 SAP
267 放送日
268 プログラムの説明
269 記録時間
270 ステーション コール サイン
271 局名
272 概要
273 抜粋
274 自動要約
275 検索のランキング
276 秘密度
277 共有ユーザー
278 共有状態
279 製品名
280 製品バージョン
281 サポートのリンク
282 ソース
283 開始日
284 課金情報
285 完了
286 仕事の所有者
287 タイトルで並べ替え
288 総ファイル サイズ
289 商標
290 ビデオ圧縮
291 ディレクター
292 データ速度
293 フレーム高
294 フレーム率
295 フレーム幅
296 ビデオの向き
297 総ビット レート

コメント

  1. こんにちは wdsでサーチの結果で遊んだりしてます。
    windows property systemは、1017個ありますが、全部が活きてるのか疑問です。
    wdsでは、一部が稼働します。
    windows property systemのDisplay Nameが日本語の時の日本語を検索していて、
    たどりつきました。
    explolerの詳細設定を取りだしましたら308個あって、貴HPの297と違っていましたので、
    比べてみました。
    オフラインで利用可能 私にはありませんでした
    ビットレート 私にはありませんでした
    ビットの深さ 私にはありませんでした
    連絡先の名 私にはありませんでした
    作曲者で並べ替え 私にはありませんでした
    露出補正 私にはありませんでした
    露出プログラム 私にはありませんでした
    露出時間 私にはありませんでした
    検索のランキング 私にはありませんでした
    グループ これが代わりにありました
    ステレオ これが代わりにありました
    ディスク これが代わりにありました
    ピットレート これが代わりにありました
    ピットの深さ これが代わりにありました
    ファイルの所有権 これが代わりにありました
    マスターキーワード これが代わりにありました
    マスターキーワード これが代わりにありました
    可用性の状態 これが代わりにありました
    関連度 これが代わりにありました
    球形 これが代わりにありました
    共有中 これが代わりにありました
    作曲者で並べ管え これが代わりにありました
    利用可能性 これが代わりにありました

    CSは、始めたばかりなので、サンプルを動かせるかわかりませんが、
    できたら動かしたいです。(動かせたら、また何か違いが出るかもしれません)
    また、面白いHPを作って下さい。
    環境は、win10pro64bitです。(1909)
    また、何かありましたら報告しますね

タイトルとURLをコピーしました