以前にファイルのプロパティ取得関連について、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情報が含まれていない場合は、撮影日時は取得できませんので空文字を返します。


コメント