以前にファイルのプロパティ取得関連について、GetDetailsOfでファイルプロパティを取得するの記事で書いたんですが、日時の属性は年月日・時間・分までは取得できますが、秒は取得できません。
例えば、撮影日時をGetDetailsOfで取得するとき、引数は「12」を与えれば取得できますが、あくまで分までです。以下はGetDetailsOfを使って撮影日時を分まで取得するサンプルです。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace ConsoleApp1 { class Program { static void Main(string[] args) { //ファイルプロパティを取得する GetFileProperty(); } //ファイルプロパティを取得する [STAThread] static void GetFileProperty() { 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); System.Diagnostics.Debug.WriteLine("ファイル名: " + filename); //撮影日時 String picDate = objFolder.GetDetailsOf(folderItem, 12); System.Diagnostics.Debug.WriteLine("撮影日時:" + picDate); } } } }
この出力結果は、以下のようになります。
ファイル名: test (1).JPG
撮影日時:2019/10/06 10:53
ファイル名: test (2).JPG
撮影日時:2019/10/22 14:19
ファイル名: test (3).JPG
撮影日時:2019/10/06 10:55
出力結果の通り、撮影日時は「2019/10/06 10:55」と分までです。作成日時や更新日時はSystem.IO.FileInfoを使って、
System.IO.FileInfo f = new System.IO.FileInfo(filePath);
Console.WriteLine(“作成日時:” + f.CreationTime.ToString());
Console.WriteLine(“更新日時:” + f.LastWriteTime.ToString());
とすれば秒まで取得できるのですが、撮影日時はFileInfoでは取得できません。ということで、撮影日時はImageから読みとって取得します。
撮影日時を秒まで取得するサンプルが以下です。※参照設定に「System.Drawing」を追加して、先頭にusingに以下2行も追加します。
using System.Drawing;
using System.Drawing.Imaging;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Drawing; using System.Drawing.Imaging; namespace ConsoleApp1 { class Program { static void Main(string[] args) { //撮影日時を秒まで取得する GetPicDateTime(); } //撮影日時を秒まで取得するサンプル static void GetPicDateTime() { String targetFolder = "D:\\test"; System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(targetFolder); System.IO.FileInfo[] files = di.GetFiles("*.*"); foreach (System.IO.FileInfo f in files) { //ファイル名 System.Diagnostics.Debug.WriteLine("ファイル名: " + f.Name); //撮影日時 String picDate = GetPicDateTimeFromImage(f.FullName); System.Diagnostics.Debug.WriteLine("撮影日時:" + picDate); } } //撮影日時を秒まで取得する public static string GetPicDateTimeFromImage(string filePath) { try { using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (Image img = Image.FromStream(fs, false, false)) { PropertyItem item = img.GetPropertyItem(36867); //文字列に変換する string picDateStr = System.Text.Encoding.UTF8.GetString(item.Value).Trim(new char[] { '\0' }); //DateTimeに変換 DateTime dt = DateTime.ParseExact(picDateStr, "yyyy:MM:dd HH:mm:ss", null); //yyyy/MM/dd HH:mm:ssの書式に設定 picDateStr = dt.ToString("yyyy/MM/dd HH:mm:ss"); return picDateStr; } } } catch (Exception e) { Console.WriteLine(e.Message); } return ""; } } }
GetPicDateTimeでGetPicDateTimeFromImageのメソッドを呼び出しています。出力結果は以下です。秒まで取得できています。
ファイル名: test (1).JPG
撮影日時:2019/10/06 10:53:08
ファイル名: test (2).JPG
撮影日時:2019/10/22 14:19:07
ファイル名: test (3).JPG
撮影日時:2019/10/06 10:55:14
当然ですが、そもそもファイルにExif情報が含まれていない場合は、撮影日時は取得できませんので空文字を返します。
コメント