クライアントからファイルのプロパティを取得したいという要望があったため、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 | 総ビット レート |
コメント
こんにちは wdsでサーチの結果で遊んだりしてます。
windows property systemは、1017個ありますが、全部が活きてるのか疑問です。
wdsでは、一部が稼働します。
windows property systemのDisplay Nameが日本語の時の日本語を検索していて、
たどりつきました。
explolerの詳細設定を取りだしましたら308個あって、貴HPの297と違っていましたので、
比べてみました。
オフラインで利用可能 私にはありませんでした
ビットレート 私にはありませんでした
ビットの深さ 私にはありませんでした
連絡先の名 私にはありませんでした
作曲者で並べ替え 私にはありませんでした
露出補正 私にはありませんでした
露出プログラム 私にはありませんでした
露出時間 私にはありませんでした
検索のランキング 私にはありませんでした
グループ これが代わりにありました
ステレオ これが代わりにありました
ディスク これが代わりにありました
ピットレート これが代わりにありました
ピットの深さ これが代わりにありました
ファイルの所有権 これが代わりにありました
マスターキーワード これが代わりにありました
マスターキーワード これが代わりにありました
可用性の状態 これが代わりにありました
関連度 これが代わりにありました
球形 これが代わりにありました
共有中 これが代わりにありました
作曲者で並べ管え これが代わりにありました
利用可能性 これが代わりにありました
CSは、始めたばかりなので、サンプルを動かせるかわかりませんが、
できたら動かしたいです。(動かせたら、また何か違いが出るかもしれません)
また、面白いHPを作って下さい。
環境は、win10pro64bitです。(1909)
また、何かありましたら報告しますね