Изменение даты файла согласно EXIF

в 6:30, , рубрики: .net, Программирование, метки: ,

После приобретения цифровой мыльницы у меня возникла необходимость каталогизировать отснятые файлы хотя бы по временам года. Но, как оказалось, после копирования с камеры дата изменения файла устанавливается в дату копирования и потом для того, чтобы узнать реальное время съемки, необходимо смотреть EXIF информацию или атрибуты файлы. Конечно, любая уважающая себя программа по просмотру файлов умеет извлекать из EXIF дату съемки, но мне данный способ неудобен.
Вот я и решил написать небольшую программу на C# которая ищет *.jpg файлы в текущем или указанном каталоге, извлекает время съемки и, в случае если это время не совпадает с временем изменения файла, то устанавливает это время согласно дате и времени съемки. Надеюсь, найдутся те, кому она пригодится.
Да, возможно есть графические программы в которые встроен аналогичный функционал, но я еще преследовал цель написать чего-нить на C#

Спасибо данной статье за полезную информацию.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Windows.Media.Imaging;

namespace ByteProgram.DateToEXIF {
    
    class ReadFiles {

        static void Main(string[] args) {
            string curDir;
            curDir = Directory.GetCurrentDirectory();
            IEnumerable<string> jpgFilesInDir;
           
            if (args.Length > 0)
            {
                if(args[0] == "/?") {
                    Console.WriteLine("Изменение даты последней записи в файл на дату съемки");
                    Console.WriteLine("Использование: ");
                    Console.WriteLine("     запуск без параметров - изменение в текущей папке");
                    Console.WriteLine("     <папка> - изменение в указанной папке");
                    return;
                }
                if (Directory.Exists(args[0]))
                {
                    jpgFilesInDir = Directory.EnumerateFiles(args[0], "*.jpg");  //получаем список файлов в указаной директории
                }
                else
                {
                    Console.WriteLine("Указанного пути не сущестует");
                    return;
                }
            }
            else
            {
                jpgFilesInDir = Directory.EnumerateFiles(curDir, "*.jpg");   //получаем список файлов в текущей директории
            }
            FileInfo fInf;
            foreach (string currentFile in jpgFilesInDir)   //проходим по всем файлам
            {
                fInf = new FileInfo(currentFile);
                Console.WriteLine("Обрабатываем файл: {0}", fInf.Name);
                ReadExifInfo rex = new ReadExifInfo(currentFile);
                try
                {
                    if (rex.CreateTime.Date.Year > 1980)
                    {
                        Console.WriteLine("Дата съемки: {0}", rex.CreateTime);
                        if (fInf.LastWriteTime != rex.CreateTime)
                        {
                            Console.WriteLine("Устанавливаем новое время редактирования файла.");
                            fInf.LastWriteTime = rex.CreateTime;
                        }
                        else
                        {
                            Console.WriteLine("Даты совпадают, изменение не требуется.");
                        }
                    }
                    else
                    {
                        Console.WriteLine("Некорректная дата съемки.");
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }  
          
        }
    }

    class ReadExifInfo {    //для чтения EXIF информации из файла
        private DateTime creationTime;
        private FileStream Foto;
        private BitmapMetadata TmpImgEXIF;
        
        public ReadExifInfo (string fileName) { //конструктор
            try
            {
                Foto = File.Open(fileName, FileMode.Open, FileAccess.Read); // открыли файл по адресу fileName для чтения
            }
            catch (Exception)
            {
                Console.WriteLine("Невозможно открыть файл");
            }
            try
            {
                JpegBitmapDecoder decoder = new JpegBitmapDecoder(Foto, BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.Default); //"распаковали" снимок и создали объект decoder
                TmpImgEXIF = (BitmapMetadata)decoder.Frames[0].Metadata.Clone(); //считали и сохранили метаданные
                creationTime = Convert.ToDateTime(TmpImgEXIF.DateTaken);    //в переменную дату съемки
                Foto.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine("Невозможно прочитать EXIF информацию.");
                Foto.Close();
            }
        }

        public DateTime CreateTime {    //возвращаем дату и время съемки
            get { return creationTime;  }
        }
    }
}

Автор: iByte

Источник

Поделиться

* - обязательные к заполнению поля