У меня довольно простая задача - из коллекции изображений мне нужно извлечь дату создания, дату последнего изменения и дату создания изображения и записать их в текстовый файл. В качестве даты съемки изображения я использую экстрактор метаданных .
. Это пример кода:
List<FileInfo> fileList = Utils.FileList(targetPath, true);
foreach (FileInfo fi in fileList)
{
string dateTime = "";
try
{
var metadatadir = ImageMetadataReader.ReadMetadata(fi.FullName);
var subIfdDirectory = metadatadir.OfType<ExifSubIfdDirectory>().FirstOrDefault();
dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTimeOriginal);
}
catch (Exception e)
{
Console.WriteLine(e);
}
DateTime creationDate = File.GetCreationTime(fi.FullName);
DateTime modifiedDate = File.GetLastWriteTime(fi.FullName);
string outputLine = "Filename " + fi.Name + "\t Creation Time: " + creationDate +
"\t Modified Time: " + modifiedDate + "\t" + "Exif Time: " + dateTime + "\n";
File.AppendAllText(targetFile, outputLine);
fileCount++;
}
Я обертываю объект Stopwatch
вокруг этого блока. чтобы измерить производительность, и вот результат, который я получаю,
Обработано 2244 файла за 440218 мс.
Если я закомментирую код Exif (блок try-catch
), я get,
Обработано 2244 файла за 116928 мс.
Я неправильно использую библиотеку? Есть ли более быстрый способ извлечения данных?
РЕДАКТИРОВАТЬ На основе обратной связи я перешел на использование StreamWriter
, как показано ниже,
using (StreamWriter tFile = File.AppendText(targetFile))
{
// Code
tFile.WriteLine(outputLine);
}
На основании этого последнее изменение времени было сокращено вдвое с помощью кода Exif,
Обработано 2244 файла за 212278 мс.