開発者の備忘

「起」と「結」しか書かないので詳細はご自分でお調べください

【C#】メディアの作成日時を取得したい

メディアの作成日時順にファイルをソートしたかったので
GetDetailsOfで取得しようとしていた。

結果

取得できた。


でも、別のPCで試したら取得できなかったので注意。
カスタマイズすれば取得できるかも?
詳細は以下にて。

やりかた

以下はソースの一部を切り出したもの

FolderItem item;
Folder folder;
ShellClass shell = new ShellClass();
String refFilePath;
String refFileName;

// 参照先パスとファイルを分割
folder = shell.NameSpace(refFilePath);
refFileName = file.Substring(file.LastIndexOf(@"\") + 1);

folder = shell.NameSpace(refFilePath);
item = folder.ParseName(refFileName);

String tmpDate = folder.GetDetailsOf(item, 208);

解説

ShellClassはShell32を参照しないと使えない。
参照方法は別途記載する。

phen1208.hatenablog.com


最終的には「tmpDate」にメディアの作成日時が格納される。


最後の行でメディアの作成日時を取得している。
第一引数は対象のFolderItemオブジェクト。
第二引数は取得したプロパティの値の何番目のデータかを指定している。


個人的には第二引数に指定する値が謎だった。
他の参考ブログを確認して該当する番号を指定しても取得できないから。


ではなぜ「208」を指定しているかというと自分で調べたから。
調べ方はシンプルで、0番目から500番目までの値を全部出力してみた。

for (int i = 0; i < 500; i++)
{
System.IO.File.AppendAllText(@"C:\Users\User\work\test\test.txt", folder.GetDetailsOf(item, i) + "\n\r");
System.Diagnostics.Debug.WriteLine(folder.GetDetailsOf(item, i));
}


すると、以下のようにファイルに出力された。

f:id:phen1208:20190526003424p:plain
test.txtの内容


ちなみに、実際のプロパティは以下。

f:id:phen1208:20190526003529p:plain
対象ファイルのプロパティ



お!235番目に出てるじゃん!
と、意気揚々と234を指定(0スタートだから)しても空文字しか取得できなかたった。

これが2番目の謎。


仕方がないのでループ200回目あたりから確認すると208番目にメディアの作成日時があった。
なので、「208」を指定しているのだ。



無事、メディアの作成日時順にソートできたけど・・・

もともとの用途は、
うちのビデオカメラで撮った動画をPCに入れると撮った日付順にソートされないためだった。
さらに作成日付や更新日付もPCに入れた日時という不親切仕様。

なので、メディアの作成日時順にリネームするツールを作っていた。


で、ツールを作った開発環境は僕のデスクトップPC。
動画を編集するのは家族共有のノートPC。
なので、ツールはノートPCで使用する。


僕のPCでは問題なくメディアの作成日時順にファイルをソートできた。
ファイル名にメディアの作成日時を設定することもできた、

でも、実際にexeをノートPCで使ってみるとメディアの作成日時が取得できなかった。

原因は調べてないからわからないけど、たぶんプロパティの取得位置が変わったのではないかと思う。
だから208じゃ取ってこれないのかなあ・・・
まあ上のfor文ですぐ調べられるんだけどね。


しばらくは僕のほうのPCでリネームすることにしました。