Rename files to padded number string
This commit is contained in:
@ -5,7 +5,9 @@ using ShellProgressBar;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using View_by_Distance.Offset.Date.Time.Original.Models;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Methods;
|
||||
using View_by_Distance.Shared.Models.Stateless;
|
||||
|
||||
@ -14,6 +16,12 @@ namespace View_by_Distance.Offset.Date.Time.Original;
|
||||
public class OffsetDateTimeOriginal
|
||||
{
|
||||
|
||||
private record Record(FileHolder FileHolder,
|
||||
bool IsIgnoreExtension,
|
||||
bool IsValidImageFormatExtension,
|
||||
int Id,
|
||||
DateTime DateTime);
|
||||
|
||||
private readonly AppSettings _AppSettings;
|
||||
private readonly string _WorkingDirectory;
|
||||
private readonly Configuration _Configuration;
|
||||
@ -60,23 +68,34 @@ public class OffsetDateTimeOriginal
|
||||
{ }
|
||||
}
|
||||
|
||||
private static List<(string, int, DateTime)> GetCollection(string checkDirectory, DateTime minimumDateTime, DateTime maximumDateTime, long ticks)
|
||||
private List<Record> GetRecords(ASCIIEncoding asciiEncoding, string checkDirectory, DateTime minimumDateTime, DateTime maximumDateTime, long ticks)
|
||||
{
|
||||
List<(string, int, DateTime)> results = new();
|
||||
List<Record> results = new();
|
||||
DateTime dateTime;
|
||||
Shared.Models.Property property;
|
||||
int? id;
|
||||
string? message;
|
||||
DateTime[] dateTimes;
|
||||
FileHolder fileHolder;
|
||||
bool isIgnoreExtension;
|
||||
DateTime? dateTimeOriginal;
|
||||
bool isValidImageFormatExtension;
|
||||
string[] files = Directory.GetFiles(checkDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string file in files)
|
||||
{
|
||||
property = Property.Models.A_Property.GetImageProperty(file);
|
||||
if (property.Id is null || property.DateTimeOriginal is null)
|
||||
fileHolder = new(file);
|
||||
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
isIgnoreExtension = isValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
|
||||
(dateTimeOriginal, dateTimes, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, fileHolder, isIgnoreExtension, isValidImageFormatExtension, asciiEncoding);
|
||||
if (message is not null)
|
||||
throw new Exception(message);
|
||||
if (id is null || dateTimeOriginal is null)
|
||||
continue;
|
||||
dateTime = property.DateTimeOriginal.Value.AddTicks(ticks);
|
||||
dateTime = dateTimeOriginal.Value.AddTicks(ticks);
|
||||
if (dateTime < minimumDateTime)
|
||||
continue;
|
||||
if (dateTime > maximumDateTime)
|
||||
continue;
|
||||
results.Add((file, property.Id.Value, property.DateTimeOriginal.Value.AddTicks(ticks)));
|
||||
results.Add(new(fileHolder, isIgnoreExtension, isValidImageFormatExtension, id.Value, dateTimeOriginal.Value.AddTicks(ticks)));
|
||||
}
|
||||
if (files.Length != results.Count)
|
||||
throw new Exception();
|
||||
@ -85,14 +104,14 @@ public class OffsetDateTimeOriginal
|
||||
|
||||
#pragma warning disable CA1416
|
||||
|
||||
private static void DateFix(string sourceDirectory, string checkDirectory, DateTime minimumDateTime, DateTime maximumDateTime, long ticks)
|
||||
private void DateFix(string sourceDirectory, ASCIIEncoding asciiEncoding, string checkDirectory, DateTime minimumDateTime, DateTime maximumDateTime, long ticks)
|
||||
{
|
||||
int? id;
|
||||
Bitmap bitmap;
|
||||
short type = 2;
|
||||
string checkFile;
|
||||
PropertyItem? propertyItem;
|
||||
string? ticksDirectory = null;
|
||||
Shared.Models.Property property;
|
||||
int dateTimeOriginal = (int)IExif.Tags.DateTimeOriginal;
|
||||
for (int i = 0; i < int.MaxValue; i++)
|
||||
{
|
||||
@ -104,26 +123,28 @@ public class OffsetDateTimeOriginal
|
||||
}
|
||||
ticks++;
|
||||
}
|
||||
List<(string, int, DateTime)> collection = GetCollection(checkDirectory, minimumDateTime, maximumDateTime, ticks);
|
||||
List<Record> records = GetRecords(asciiEncoding, checkDirectory, minimumDateTime, maximumDateTime, ticks);
|
||||
ConstructorInfo? constructorInfo = typeof(PropertyItem).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public, null, Array.Empty<Type>(), null) ?? throw new Exception();
|
||||
string message = nameof(OffsetDateTimeOriginal);
|
||||
string? message = nameof(OffsetDateTimeOriginal);
|
||||
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
|
||||
ProgressBar progressBar = new(collection.Count, message, options);
|
||||
foreach ((string file, int id, DateTime dateTime) in collection)
|
||||
ProgressBar progressBar = new(records.Count, message, options);
|
||||
foreach (Record record in records)
|
||||
{
|
||||
progressBar.Tick();
|
||||
if (ticksDirectory is null)
|
||||
throw new Exception();
|
||||
checkFile = Path.Combine(ticksDirectory, Path.GetFileName(file));
|
||||
checkFile = Path.Combine(ticksDirectory, record.FileHolder.Name);
|
||||
if (File.Exists(checkFile))
|
||||
continue;
|
||||
propertyItem = Shared.Models.Stateless.Methods.IProperty.GetPropertyItem(constructorInfo, dateTimeOriginal, type, dateTime.ToString("yyyy:MM:dd HH:mm:ss"));
|
||||
bitmap = new(file);
|
||||
propertyItem = Property.Models.Stateless.IProperty.GetPropertyItem(constructorInfo, dateTimeOriginal, type, record.DateTime.ToString("yyyy:MM:dd HH:mm:ss"));
|
||||
bitmap = new(record.FileHolder.FullName);
|
||||
bitmap.SetPropertyItem(propertyItem);
|
||||
bitmap.Save(checkFile);
|
||||
bitmap.Dispose();
|
||||
property = Property.Models.A_Property.GetImageProperty(checkFile);
|
||||
if (property.Id is null || property.Id.Value != id)
|
||||
(_, _, id, message) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, record.FileHolder, record.IsIgnoreExtension, record.IsValidImageFormatExtension, asciiEncoding);
|
||||
if (message is not null)
|
||||
throw new Exception(message);
|
||||
if (id is null || id.Value != record.Id)
|
||||
throw new Exception();
|
||||
}
|
||||
progressBar.Dispose();
|
||||
@ -131,13 +152,14 @@ public class OffsetDateTimeOriginal
|
||||
|
||||
#pragma warning restore CA1416
|
||||
|
||||
private static void DateFix(ILogger log, string sourceDirectory)
|
||||
private void DateFix(ILogger log, string sourceDirectory)
|
||||
{
|
||||
string checkDirectory;
|
||||
ASCIIEncoding asciiEncoding = new();
|
||||
long oneYearTicks = DateTime.MinValue.AddYears(1).Ticks;
|
||||
checkDirectory = Path.Combine(sourceDirectory, oneYearTicks.ToString());
|
||||
if (Directory.Exists(checkDirectory))
|
||||
DateFix(sourceDirectory, checkDirectory, DateTime.MinValue, DateTime.MaxValue, new TimeSpan(oneYearTicks - DateTime.MinValue.Ticks).Ticks);
|
||||
DateFix(sourceDirectory, asciiEncoding, checkDirectory, DateTime.MinValue, DateTime.MaxValue, new TimeSpan(oneYearTicks - DateTime.MinValue.Ticks).Ticks);
|
||||
else
|
||||
{
|
||||
checkDirectory = Path.Combine(sourceDirectory, "1");
|
||||
@ -160,16 +182,40 @@ public class OffsetDateTimeOriginal
|
||||
log.Error("bad file(s) or target file(s) or maximum directory doesn't equal 1!");
|
||||
else
|
||||
{
|
||||
int? badId;
|
||||
int? targetId;
|
||||
string? badMessage;
|
||||
string? targetMessage;
|
||||
DateTime[] badDateTimes;
|
||||
bool badIsIgnoreExtension;
|
||||
DateTime[] targetDateTimes;
|
||||
bool targetIsIgnoreExtension;
|
||||
DateTime? badDateTimeOriginal;
|
||||
DateTime? targetDateTimeOriginal;
|
||||
FileHolder badFileHolder = new(badFiles.First());
|
||||
FileHolder targetFileHolder = new(targetFiles.First());
|
||||
bool badIsValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(badFileHolder.ExtensionLowered);
|
||||
bool targetIsValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(targetFileHolder.ExtensionLowered);
|
||||
badIsIgnoreExtension = badIsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(badFileHolder.ExtensionLowered);
|
||||
targetIsIgnoreExtension = targetIsValidImageFormatExtension && _PropertyConfiguration.IgnoreExtensions.Contains(targetFileHolder.ExtensionLowered);
|
||||
DateTime minimumDateTime = DateTime.ParseExact(Path.GetFileName(minimumDirectory.First()), format, null, System.Globalization.DateTimeStyles.None);
|
||||
DateTime maximumDateTime = DateTime.ParseExact(Path.GetFileName(maximumDirectory.First()), format, null, System.Globalization.DateTimeStyles.None).AddHours(23);
|
||||
Shared.Models.Property badProperty = Property.Models.A_Property.GetImageProperty(badFiles.First());
|
||||
Shared.Models.Property targetProperty = Property.Models.A_Property.GetImageProperty(targetFiles.First());
|
||||
if (badProperty.DateTimeOriginal is null || targetProperty.DateTimeOriginal is null)
|
||||
(badDateTimeOriginal, badDateTimes, badId, badMessage) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, badFileHolder, badIsIgnoreExtension, badIsValidImageFormatExtension, asciiEncoding);
|
||||
if (badMessage is not null)
|
||||
throw new Exception(badMessage);
|
||||
if (!badDateTimes.Any() || badId is null)
|
||||
throw new Exception(badMessage);
|
||||
(targetDateTimeOriginal, targetDateTimes, targetId, targetMessage) = Property.Models.Stateless.IProperty.Get(_PropertyConfiguration.PopulatePropertyId, targetFileHolder, targetIsIgnoreExtension, targetIsValidImageFormatExtension, asciiEncoding);
|
||||
if (targetMessage is not null)
|
||||
throw new Exception(targetMessage);
|
||||
if (!targetDateTimes.Any() || targetId is null)
|
||||
throw new Exception(targetMessage);
|
||||
if (badDateTimeOriginal is null || targetDateTimeOriginal is null)
|
||||
log.Error("Date is null!");
|
||||
else
|
||||
{
|
||||
TimeSpan timeSpan = new(targetProperty.DateTimeOriginal.Value.Ticks - badProperty.DateTimeOriginal.Value.Ticks);
|
||||
DateFix(sourceDirectory, checkDirectory, minimumDateTime, maximumDateTime, timeSpan.Ticks);
|
||||
TimeSpan timeSpan = new(targetDateTimeOriginal.Value.Ticks - badDateTimeOriginal.Value.Ticks);
|
||||
DateFix(sourceDirectory, asciiEncoding, checkDirectory, minimumDateTime, maximumDateTime, timeSpan.Ticks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -66,7 +66,6 @@
|
||||
"ResultContent": "()",
|
||||
"ResultSingleton": "{}",
|
||||
"RootDirectory": "D:/Images",
|
||||
"WriteBitmapDataBytes": false,
|
||||
"IgnoreExtensions": [
|
||||
".gif",
|
||||
".GIF",
|
||||
@ -90,36 +89,6 @@
|
||||
".TIFF",
|
||||
".tif",
|
||||
".TIF"
|
||||
],
|
||||
"ValidMetadataExtensions": [
|
||||
".3gp",
|
||||
".3GP",
|
||||
".avi",
|
||||
".AVI",
|
||||
".bmp",
|
||||
".BMP",
|
||||
".gif",
|
||||
".GIF",
|
||||
".ico",
|
||||
".ICO",
|
||||
".jpeg",
|
||||
".JPEG",
|
||||
".jpg",
|
||||
".JPG",
|
||||
".m4v",
|
||||
".M4V",
|
||||
".mov",
|
||||
".MOV",
|
||||
".mp4",
|
||||
".MP4",
|
||||
".mta",
|
||||
".MTA",
|
||||
".png",
|
||||
".PNG",
|
||||
".tiff",
|
||||
".TIFF",
|
||||
".tif",
|
||||
".TIF"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user