【C#】ファイルの属性(プロパティ)情報を取得する方法
こんにちは、ノムノムです。
今回は、ファイルの持っているプロパティの情報を取得する方法を説明したいと思います。
例えばプロパティの値を取得できれば、写真の撮影日時を取得してそれを各年月ごとにフォルダ分けをするなんてこともできます。
他にもいろいろできそうです。もうここまでくるとあなたのアイデア次第で何でもできそうです。
それではやってみましょう
プロパティを取得する関数を作ってみました。
以下にプロパティを取得する関数を作成しましたので、解説などいらないという型は以下のソースをコピペすればよろしいかと思います。
引数の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 | 番地 (会社) |
| 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 | 総ビット レート |
まとめ
プログラミングの上達ポイントの一つは欲しい情報を如何にして手に入れるかが重要です。
取得できる情報が増えれば増えるほどできることの選択肢が増えていきます。
選択肢が増えるということは、機能を充実させることができる可能性が増すということです。
プログラミングは自分で考えてこそ上達するもの、書いてあることができるその先の「だからこんなこともできる」まで追求できたら素晴らしいと思います。
ここまで読んでいただきありがとうございます。

