【C#】ファイルの属性(プロパティ)情報を取得する方法

2023年2月7日

こんにちは、ノムノムです。

今回は、ファイルの持っているプロパティの情報を取得する方法を説明したいと思います。

例えばプロパティの値を取得できれば、写真の撮影日時を取得してそれを各年月ごとにフォルダ分けをするなんてこともできます。

他にもいろいろできそうです。もうここまでくるとあなたのアイデア次第で何でもできそうです。

それではやってみましょう

プロパティを取得する関数を作ってみました。

以下にプロパティを取得する関数を作成しましたので、解説などいらないという型は以下のソースをコピペすればよろしいかと思います。

引数のproperty_indexはプロパティ一覧をご覧ください

/// <summary>
/// プロパティの値を取得
/// </summary>
/// <param name="file"></param>
/// <param name="property_index"></param>
/// <returns></returns>
[STAThread]
public static string GetFilePropertyValue(string file, int property_index)
{

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

    string ret = "";

    try
    {
        //フォルダを取得
        Shell32.Folder objFolder = shell.NameSpace(System.IO.Path.GetDirectoryName(file));

        //ファイルを取得
        Shell32.FolderItem folderItem = objFolder.ParseName(System.IO.Path.GetFileName(file));

        //プロパティ情報を取得
        ret = objFolder.GetDetailsOf(folderItem, property_index);

        if (ret.Trim() == "")
        {
            return "";
        }

    }
    catch
    {
        return "";
    }

    return ret;
}

Shell.Applicationの利用

プロパティを取得するためにShell.Applicationを利用します。

Shell(シェル)とは、ファイル操作などを行うプログラムで現在のWindowsであれば標準で実装されています。

Shell.Applicationを取得するには以下のように記述します。

var shellAppType = Type.GetTypeFromProgID("Shell.Application");

これはクラスを取得したような状態だと考えてください。次にインスタンスを作成します。

dynamic shell = Activator.CreateInstance(shellAppType);

これで準備が完了しました。

ファイルから情報を取得

次にファイルからプロパティ情報を取得します。

以下のソースになります。

//フォルダを取得
Shell32.Folder objFolder = shell.NameSpace(System.IO.Path.GetDirectoryName(file));

//ファイルを取得
Shell32.FolderItem folderItem = objFolder.ParseName(System.IO.Path.GetFileName(file));

//プロパティ情報を取得
ret = objFolder.GetDetailsOf(folderItem, property_index);

コメントの通りですが最後のGetDetailOf関数のproperty_indexが取得するプロパティの内容になります。

このインデックスの内容を以下に表示します。

プロパティ一覧

Indexプロパティ名
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番地 (会社)
65FAX 番号 (会社)
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自宅電話
93IM アドレス
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サフィックス
123TTY/TTD 電話
124テレックス
125Web ページ
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リンク先
193URL
194メディアの作成日時
195リリース日
196エンコード方式
197エピソード番号
198プロデューサー
199発行元
200シーズン番号
201サブタイトル
202ユーザー Web URL
203作者
204添付ファイル
205BCC アドレス
206BCC
207CC アドレス
208CC
209会話 ID
210受信日時
211送信日時
212送信元アドレス
213差出人
214添付ファイルの有無
215送信者アドレス
216送信者名
217ストア
218送信先アドレス
219To do タイトル
220宛先
221経費情報
222アルバムのアーティスト
223アルバム アーティストで並べ替え
224アルバム ID
225アルバムで並べ替え
226参加アーティストで並べ替え
227ビート数/分
228作曲者
229作曲者で並べ替え
230イニシャル キー
231コンパイルの一部
232雰囲気
233セットのパート
234期間
235
236保護者による制限
237保護者による制限の理由
238使用領域
239EXIF バージョン
240イベント
241露出補正
242露出プログラム
243露出時間
244絞り値
245フラッシュ モード
246焦点距離
24735mm 焦点距離
248ISO 速度
249レンズ メーカー
250レンズ モデル
251光源
252最大絞り
253測光モード
254向き
255人物
256プログラムのモード
257彩度
258対象の距離
259ホワイト バランス
260優先度
261プロジェクト
262チャンネル番号
263この回のタイトル
264字幕
265再放映
266SAP
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総ビット レート

まとめ

プログラミングの上達ポイントの一つは欲しい情報を如何にして手に入れるかが重要です。

取得できる情報が増えれば増えるほどできることの選択肢が増えていきます。

選択肢が増えるということは、機能を充実させることができる可能性が増すということです。

プログラミングは自分で考えてこそ上達するもの、書いてあることができるその先の「だからこんなこともできる」まで追求できたら素晴らしいと思います。

ここまで読んでいただきありがとうございます。

C#

Posted by nomux2