Drag-Drop-Explorer

This commit is contained in:
Mike Phares 2023-01-02 14:58:22 -07:00
parent 110b306206
commit d0cd52807d
52 changed files with 1092 additions and 846 deletions

17
.vscode/launch.json vendored
View File

@ -175,6 +175,23 @@
"console": "externalTerminal", "console": "externalTerminal",
"stopAtEntry": false, "stopAtEntry": false,
"requireExactSource": false "requireExactSource": false
},
{
"name": "Rename",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Rename/bin/Debug/net7.0/win-x64/Rename.dll",
"args": [
"s"
],
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"cwd": "${workspaceFolder}",
"console": "externalTerminal",
"stopAtEntry": false,
"requireExactSource": false
} }
] ]
} }

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Compare</PackageId> <PackageId>Phares.View.by.Distance.Compare</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Date.Group</PackageId> <PackageId>Phares.View.by.Distance.Date.Group</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Delete.By.Distinct</PackageId> <PackageId>Phares.View.by.Distance.Delete.By.Distinct</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -78,7 +78,8 @@ public class DeleteByDistinct
if (!fileTicksToNames.TryGetValue(checkDate.Ticks, out fileNames)) if (!fileTicksToNames.TryGetValue(checkDate.Ticks, out fileNames))
throw new Exception(); throw new Exception();
} }
checkName = fileInfo.Name.ToLower().Replace(".jpeg", ".jpg"); checkName = fileInfo.Name[..10];
// checkName = fileInfo.Name.ToLower().Replace(".jpeg", ".jpg");
if (fileNames.Contains(checkName)) if (fileNames.Contains(checkName))
deletedFiles.Add(file); deletedFiles.Add(file);
else else
@ -128,4 +129,5 @@ public class DeleteByDistinct
} }
} }
} }
} }

View File

@ -1,13 +1,12 @@
{ {
"xCompareRootDirectory": "", "CompareRootDirectory": "D:/7) Question/- - - Videos A",
"CompareRootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401",
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Log4netProvider": "Debug" "Log4netProvider": "Debug"
} }
}, },
"MaxDegreeOfParallelism": 6, "MaxDegreeOfParallelism": 6,
"SearchPattern": "*.j*", "SearchPattern": "*.*",
"Serilog": { "Serilog": {
"MinimumLevel": "Debug" "MinimumLevel": "Debug"
}, },
@ -15,231 +14,10 @@
"Configuration": { "Configuration": {
"xRootDirectory": "D:/2) Images B/Corrupt", "xRootDirectory": "D:/2) Images B/Corrupt",
"xxRootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401", "xxRootDirectory": "D:/2) Images B/Not-Copy-Copy-45f4401",
"RootDirectory": "D:/1) Images A/Images-45f4401", "xxxRootDirectory": "D:/1) Images A/Images-45f4401",
"VerifyToSeason": [ "RootDirectory": "E:/3) Videos A/Device Videos 2_0_0_3 - Current",
". 2000", "xxxxxRootDirectory": "E:/4) Videos B/Device Videos 2_0_0_3 - Current - Ignore",
". 2001", "VerifyToSeason": []
". 2002",
". 2003",
". 2004",
". 2005",
". 2006",
". 2007",
". 2008",
". 2009",
". 2010",
". 2011",
". 2012",
". 2013",
". 2014",
". 2015",
". 2016",
". 2017",
". 2018",
". 2019",
". 2020",
". 2021",
". 2022",
". 2023",
". 2024",
". 2025",
". 2026",
". 2027",
". 2028",
". 2029",
"2000.0 Winter",
"2002.1 Spring",
"2002.4 Winter",
"2003.0 Winter",
"2003.1 Spring",
"2003.3 Fall",
"2003.4 Winter",
"2004.0 Winter",
"2005.1 Spring",
"2005.2 Summer",
"2005.3 Fall",
"2005.4 Winter",
"2006.0 Winter",
"2006.1 Spring",
"2006.3 Fall",
"2007.0 Winter",
"2007.2 Summer Logan Michael",
"2007.2 Summer",
"2007.3 Fall Logan Michael",
"2007.4 Winter Logan Michael",
"2008.0 Winter Logan Michael",
"2008.1 Spring Logan Michael",
"2008.2 Summer Logan Michael",
"2008.2 Summer",
"2008.3 Fall Logan Michael",
"2009.0 Winter Logan Michael",
"2009.0 Winter",
"2009.1 Spring Logan Michael",
"2009.1 Spring",
"2009.2 Summer Logan Michael",
"2009.2 Summer",
"2009.3 Fall Logan Michael",
"2009.3 Fall",
"2009.4 Winter Logan Michael",
"2009.4 Winter",
"2010.0 Winter Logan Michael",
"2010.0 Winter",
"2010.1 Spring Logan Michael",
"2010.1 Spring",
"2010.2 Summer",
"2010.3 Fall Logan Michael",
"2010.3 Fall",
"2010.4 Winter",
"2011.0 Winter",
"2011.1 Spring",
"2011.2 Summer",
"2011.3 Fall",
"2011.4 Winter",
"2012.0 Winter Chelsea 2012",
"2012.0 Winter Chelsea",
"2012.0 Winter",
"2012.1 Spring Chelsea",
"2012.1 Spring",
"2012.2 Summer Chelsea",
"2012.2 Summer",
"2012.3 Fall Chelsea",
"2012.3 Fall",
"2012.4 Winter Chelsea",
"2012.4 Winter",
"2013.0 Winter Chelsea 2013",
"2013.0 Winter Chelsea",
"2013.0 Winter",
"2013.1 Spring",
"2013.2 Summer Chelsea",
"2013.2 Summer",
"2013.3 Fall Chelsea",
"2013.3 Fall",
"2013.4 Winter",
"2014.0 Winter",
"2014.1 Spring",
"2014.2 Summer",
"2014.3 Fall",
"2014.4 Winter",
"2015.0 Winter",
"2015.1 Spring",
"2015.2 Summer",
"2015.3 Fall",
"2015.4 Winter",
"2016.0 Winter",
"2016.1 Spring",
"2016.2 Summer",
"2016.3 Fall",
"2016.4 Winter",
"2017.1 Spring",
"2017.2 Summer",
"2017.3 Fall",
"2017.4 Winter",
"2018.0 Winter",
"2018.1 Spring",
"2018.3 Fall",
"2018.4 Winter",
"2019.0 Winter",
"2019.1 Spring",
"2019.2 Summer",
"2019.3 Fall",
"2019.4 Winter",
"2020.0 Winter",
"2020.1 Spring",
"2020.2 Summer",
"2020.3 Fall",
"2020.4 Winter",
"2021.1 Spring",
"2021.2 Summer",
"2021.3 Fall",
"2021.4 Winter",
"2022.0 Winter",
"2022.1 Spring",
"Anthem 2015",
"April 2010",
"April 2013",
"December 2006",
"December 2010",
"Fall 2005",
"Fall 2015",
"Fall 2016",
"Fall 2017",
"Fall 2018",
"Fall 2019",
"Fall 2020",
"Fall 2021",
"February 2010",
"January 2015",
"July 2010",
"June 2010",
"Kids 2005",
"March 2013",
"May 2010",
"May 2011",
"May 2013",
"October 2005",
"October 2014",
"Spring 2013",
"Spring 2014",
"Spring 2016",
"Spring 2018",
"Spring 2019",
"Spring 2020",
"Summer 2011",
"Summer 2012",
"Summer 2013",
"Summer 2014",
"Summer 2015",
"Summer 2016",
"Summer 2017",
"Summer 2018",
"Summer 2020",
"Summer 2021",
"Winter 2015",
"Winter 2016",
"Winter 2017",
"Winter 2018",
"Winter 2019-2020",
"Winter 2020",
"zzz 2005.0 Winter Tracy Pictures",
"zzz 2005.1 Spring Tracy Pictures",
"zzz 2005.2 Summer Tracy Pictures",
"zzz 2005.3 Fall Tracy Pictures",
"zzz 2005.4 Winter Tracy Pictures",
"zzz 2006.1 Spring Tracy Pictures",
"zzz 2007.0 Winter Tracy Pictures",
"zzz 2007.2 Summer Tracy Pictures",
"zzz 2008.0 Winter Tracy Pictures",
"zzz 2008.2 Summer Tracy Pictures",
"zzz 2009.0 Winter Tracy Pictures",
"zzz 2009.2 Summer Tracy Pictures",
"zzz 2009.3 Fall Tracy Pictures",
"zzz 2009.4 Winter Tracy Pictures",
"zzz 2010.0 Winter Tracy Pictures",
"zzz 2010.1 Spring Tracy Pictures",
"zzz 2010.2 Summer Tracy Pictures",
"zzz 2010.3 Fall Tracy Pictures",
"zzz 2011.0 Winter Tracy Pictures",
"zzz 2011.1 Spring Tracy Pictures",
"zzz 2011.2 Summer Tracy Pictures",
"zzz 2011.3 Fall Tracy Pictures",
"zzz 2011.4 Winter Tracy Pictures",
"zzz 2012.0 Winter Tracy Pictures",
"zzz 2012.1 Spring Tracy Pictures",
"zzz 2012.2 Summer Tracy Pictures",
"zzz 2012.3 Fall Tracy Pictures",
"zzz 2012.4 Winter Tracy Pictures",
"zzz 2013.0 Winter Tracy Pictures",
"zzz 2013.1 Spring Tracy Pictures",
"zzz 2013.2 Summer Tracy Pictures",
"zzz 2013.3 Fall Tracy Pictures",
"zzz 2013.4 Winter Tracy Pictures",
"zzz 2014.0 Winter Tracy Pictures",
"zzz 2014.1 Spring Tracy Pictures",
"zzz 2014.2 Summer Tracy Pictures",
"zzz 2014.3 Fall Tracy Pictures",
"zzz 2014.4 Winter Tracy Pictures",
"zzz 2015.0 Winter Tracy Pictures"
]
} }
} }
} }

View File

@ -1,5 +1,5 @@
{ {
"CompareRootDirectory": "", "ComparePathsFile": "",
"Company": "Mike Phares", "Company": "Mike Phares",
"Linux": {}, "Linux": {},
"Logging": { "Logging": {

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Delete.By.Relative</PackageId> <PackageId>Phares.View.by.Distance.Delete.By.Relative</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Distance</PackageId> <PackageId>Phares.View.by.Distance.Distance</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -1,6 +1,6 @@
namespace View_by_Distance.Drag_Drop_Explorer; namespace View_by_Distance.Drag_Drop_Explorer;
partial class Form partial class DragDropExplorer
{ {
/// <summary> /// <summary>
/// Required designer variable. /// Required designer variable.
@ -32,7 +32,7 @@ partial class Form
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(640, 100); this.ClientSize = new System.Drawing.Size(640, 100);
this.StartPosition = FormStartPosition.CenterScreen; this.StartPosition = FormStartPosition.CenterScreen;
this.Text = "Form1"; this.Text = "Drag Drop Explorer";
} }
#endregion #endregion

View File

@ -6,11 +6,12 @@ using System.Globalization;
using System.Reflection; using System.Reflection;
using System.Text.Json; using System.Text.Json;
using View_by_Distance.Drag_Drop_Explorer.Models; using View_by_Distance.Drag_Drop_Explorer.Models;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods; using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Drag_Drop_Explorer; namespace View_by_Distance.Drag_Drop_Explorer;
public partial class Form : System.Windows.Forms.Form public partial class DragDropExplorer : Form
{ {
private readonly ILogger _Logger; private readonly ILogger _Logger;
@ -23,7 +24,7 @@ public partial class Form : System.Windows.Forms.Form
private readonly string _WorkingDirectory; private readonly string _WorkingDirectory;
private readonly IsEnvironment _IsEnvironment; private readonly IsEnvironment _IsEnvironment;
public Form() public DragDropExplorer()
{ {
InitializeComponent(); InitializeComponent();
ILogger logger; ILogger logger;
@ -48,17 +49,17 @@ public partial class Form : System.Windows.Forms.Form
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot); _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
Log.Logger = loggerConfiguration.CreateLogger(); Log.Logger = loggerConfiguration.CreateLogger();
logger = Log.ForContext<Form>(); logger = Log.ForContext<DragDropExplorer>();
logger.Information("Complete"); logger.Information("Complete");
_Logger = logger; _Logger = logger;
_AppSettings = appSettings; _AppSettings = appSettings;
Text = "Drag Drop Explorer";
_IsEnvironment = isEnvironment; _IsEnvironment = isEnvironment;
_WorkingDirectory = workingDirectory; _WorkingDirectory = workingDirectory;
_ProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false }; _ProgressBar = new() { TabIndex = 4, Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
_FirstTextBox = new() { Location = new(5, 5), Dock = DockStyle.Top, Text = _IsEnvironment.Profile }; string json = JsonSerializer.Serialize(_AppSettings, new JsonSerializerOptions { WriteIndented = true });
_PathTextBox = new() { Location = new(5, 5), Dock = DockStyle.Top, Text = _AppSettings.WorkingDirectoryName }; _FirstTextBox = new() { TabIndex = 1, Text = _IsEnvironment.Profile, Location = new(5, 5), Dock = DockStyle.Top };
_JsonTextBox = new() { Location = new(5, 5), Dock = DockStyle.Top, Text = JsonSerializer.Serialize(_AppSettings, new JsonSerializerOptions { WriteIndented = true }), Multiline = true, MinimumSize = new(1, 80) }; _PathTextBox = new() { TabIndex = 2, Text = _AppSettings.WorkingDirectoryName, Location = new(5, 5), Dock = DockStyle.Top };
_JsonTextBox = new() { TabIndex = 3, Text = json, Multiline = true, MinimumSize = new(1, 80), Location = new(5, 5), Dock = DockStyle.Top };
Load += new EventHandler(Form1_Load); Load += new EventHandler(Form1_Load);
Controls.Add(_ProgressBar); Controls.Add(_ProgressBar);
Controls.Add(_JsonTextBox); Controls.Add(_JsonTextBox);
@ -94,6 +95,7 @@ public partial class Form : System.Windows.Forms.Form
{ {
if (sender is TextBox textBox) if (sender is TextBox textBox)
{ {
textBox.Text = GetConverted(textBox.Text);
if (textBox.Text == "ps") if (textBox.Text == "ps")
throw new NotImplementedException(); throw new NotImplementedException();
@ -133,10 +135,10 @@ public partial class Form : System.Windows.Forms.Form
{ {
string converted; string converted;
FileInfo fileInfo; FileInfo fileInfo;
_FirstTextBox.Text = paths[0];
List<MatchNginx> files = new(); List<MatchNginx> files = new();
DateTime dateTime = DateTime.Now; DateTime dateTime = DateTime.Now;
List<MatchNginx> directories = new(); List<MatchNginx> directories = new();
_FirstTextBox.Text = GetConverted(paths[0]);
string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
string directory = Path.Combine(_WorkingDirectory, $"{dateTime.Year}_{weekOfYear}"); string directory = Path.Combine(_WorkingDirectory, $"{dateTime.Year}_{weekOfYear}");
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))

View File

@ -9,7 +9,7 @@ static class Program
static void Main() static void Main()
{ {
ApplicationConfiguration.Initialize(); ApplicationConfiguration.Initialize();
Application.Run(new Form()); Application.Run(new DragDropExplorer());
} }
} }

View File

@ -10,7 +10,7 @@
"request": "launch", "request": "launch",
"preLaunchTask": "build", "preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path. // If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/bin/Debug/net7.0-windows/win-x64/Drag-Drop.dll", "program": "${workspaceFolder}/bin/Debug/net7.0-windows/win-x64/Drag-Drop-Search.dll",
"args": [], "args": [],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console

41
Drag-Drop-Search/.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,41 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Drag-Drop-Search.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/Drag-Drop-Search.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/Drag-Drop-Search.csproj"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@ -1,6 +1,6 @@
namespace View_by_Distance.Drag_Drop; namespace View_by_Distance.Drag_Drop;
partial class Form partial class DragDropSearch
{ {
/// <summary> /// <summary>
/// Required designer variable. /// Required designer variable.
@ -32,7 +32,7 @@ partial class Form
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(640, 100); this.ClientSize = new System.Drawing.Size(640, 100);
this.StartPosition = FormStartPosition.CenterScreen; this.StartPosition = FormStartPosition.CenterScreen;
this.Text = "Form1"; this.Text = "Drag Drop Search";
} }
#endregion #endregion

View File

@ -0,0 +1,204 @@
using Microsoft.Extensions.Configuration;
using Phares.Shared;
using Serilog;
using System.Diagnostics;
using System.Reflection;
using View_by_Distance.Drag_Drop.Models;
using View_by_Distance.Resize.Models;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Drag_Drop;
public partial class DragDropSearch : Form
{
private readonly ILogger _Logger;
private readonly TextBox _TextBox;
private readonly AppSettings _AppSettings;
private readonly ProgressBar _ProgressBar;
private readonly string _WorkingDirectory;
private readonly Configuration _Configuration;
private readonly IsEnvironment _IsEnvironment;
private readonly Dictionary<int, Item> _IdToItem;
private readonly string _ResizeFileNameExtension;
private readonly IConfigurationRoot _ConfigurationRoot;
private readonly Property.Models.Configuration _PropertyConfiguration;
public DragDropSearch()
{
InitializeComponent();
ILogger logger;
AppSettings appSettings;
string workingDirectory;
Configuration configuration;
IsEnvironment isEnvironment;
_IdToItem = new();
IConfigurationRoot configurationRoot;
LoggerConfiguration loggerConfiguration = new();
Property.Models.Configuration propertyConfiguration;
Assembly assembly = Assembly.GetExecutingAssembly();
bool debuggerWasAttachedAtLineZero = Debugger.IsAttached || assembly.Location.Contains(@"\bin\Debug");
isEnvironment = new(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: debuggerWasAttachedAtLineZero, nullASPNetCoreEnvironmentIsProduction: !debuggerWasAttachedAtLineZero);
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(isEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true);
configurationRoot = configurationBuilder.Build();
appSettings = Models.Binder.AppSettings.Get(configurationRoot);
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
throw new Exception("Working path name must have parentDirectory value!");
workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName);
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
Log.Logger = loggerConfiguration.CreateLogger();
logger = Log.ForContext<DragDropSearch>();
propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
(_, _, string resizeFileNameExtension) = C_Resize.GetTuple(configuration.OutputExtension, configuration.OutputQuality);
logger.Information("Complete");
_Logger = logger;
_AppSettings = appSettings;
_Configuration = configuration;
_IsEnvironment = isEnvironment;
_WorkingDirectory = workingDirectory;
_ConfigurationRoot = configurationRoot;
_PropertyConfiguration = propertyConfiguration;
_ResizeFileNameExtension = resizeFileNameExtension;
_TextBox = new() { Location = new(5, 5), Dock = DockStyle.Top };
_ProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
Load += new EventHandler(Form1_Load);
Controls.Add(_ProgressBar);
Controls.Add(_TextBox);
}
void Form1_Load(object? sender, EventArgs e)
{
try
{
AllowDrop = true;
DragDrop += new DragEventHandler(Form1_DragDrop);
DragEnter += new DragEventHandler(Form1_DragEnter);
_TextBox.LostFocus += new EventHandler(TextBox_LostFocus);
}
catch (Exception)
{
throw;
}
}
void TextBox_LostFocus(object? sender, EventArgs e)
{
try
{
if (_TextBox.Text == "ps")
throw new NotImplementedException();
}
catch (Exception)
{
throw;
}
}
void Form1_DragEnter(object? sender, DragEventArgs e)
{
try
{
if (e.Data is not null && e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
}
catch (Exception)
{
throw;
}
}
void LoadData()
{
Container[] containers;
Property.Models.A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _ResizeFileNameExtension, _Configuration.Reverse);
(_, _, _, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, propertyLogic);
List<Item> collection = Program.GetItemCollection(_Configuration, containers);
foreach (Item item in collection)
{
if (item.Property?.Id is null)
continue;
if (_IdToItem.ContainsKey(item.Property.Id.Value))
continue;
_IdToItem.Add(item.Property.Id.Value, item);
}
if (_Logger is null)
throw new NullReferenceException(nameof(_Logger));
_Logger.Debug((_AppSettings is null).ToString());
_Logger.Debug((_Configuration is null).ToString());
_Logger.Debug((_IsEnvironment is null).ToString());
_Logger.Debug((_WorkingDirectory is null).ToString());
_Logger.Debug((_ConfigurationRoot is null).ToString());
_Logger.Debug((_PropertyConfiguration is null).ToString());
}
public static string? GetFaceEncoding(string file)
{
string? result;
List<string> results = new();
const string comment = "Comment: ";
if (File.Exists(file))
{
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
foreach (MetadataExtractor.Directory directory in directories)
{
if (directory.Name != "PNG-tEXt")
continue;
foreach (MetadataExtractor.Tag tag in directory.Tags)
{
if (tag.Name != "Textual Data" || string.IsNullOrEmpty(tag.Description))
continue;
if (!tag.Description.StartsWith(comment))
continue;
results.Add(tag.Description);
}
}
}
result = results.Any() ? results[0][comment.Length..] : null;
return result;
}
private void GetDirectoriesOrDoDragDrop(string[] paths)
{
string name;
string[] segments;
foreach (string path in paths)
{
name = Path.GetFileNameWithoutExtension(path);
Text = name;
segments = name.Split('.');
if (!_IdToItem.Any())
LoadData();
if (int.TryParse(segments[0], out int id) && _IdToItem.TryGetValue(id, out Item? item))
{
Text = item.ImageFileHolder.Name;
_TextBox.Text = item.ImageFileHolder.FullName;
if (item.ImageFileHolder.DirectoryName is not null)
_Logger.Information(item.ImageFileHolder.DirectoryName);
if (!string.IsNullOrEmpty(item.ImageFileHolder.DirectoryName))
_ = Process.Start("explorer.exe", string.Concat("\"", item.ImageFileHolder.DirectoryName, "\""));
}
}
}
void Form1_DragDrop(object? sender, DragEventArgs e)
{
try
{
if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths)
_TextBox.Text = string.Empty;
else
GetDirectoriesOrDoDragDrop(paths);
}
catch (Exception)
{
throw;
}
}
}

View File

@ -11,7 +11,7 @@ static class Program
static void Main() static void Main()
{ {
ApplicationConfiguration.Initialize(); ApplicationConfiguration.Initialize();
Application.Run(new Form()); Application.Run(new DragDropSearch());
} }
private static Item[] GetFilterItems(Models.Configuration configuration, Container container) private static Item[] GetFilterItems(Models.Configuration configuration, Container container)

View File

@ -1,550 +0,0 @@
using Microsoft.Extensions.Configuration;
using Phares.Shared;
using Serilog;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Text.Json;
using View_by_Distance.Drag_Drop.Models;
using View_by_Distance.FaceRecognitionDotNet;
using View_by_Distance.Resize.Models;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Drag_Drop;
public partial class Form : System.Windows.Forms.Form
{
private readonly ILogger _Logger;
private readonly TextBox _TextBox;
private readonly List<string> _Lines;
private readonly AppSettings _AppSettings;
private readonly ProgressBar _ProgressBar;
private readonly string _WorkingDirectory;
private readonly Configuration _Configuration;
private readonly IsEnvironment _IsEnvironment;
private readonly ProgressBar _InnerProgressBar;
private readonly Dictionary<int, Item> _IdToItem;
private readonly string _ResizeFileNameExtension;
private readonly IConfigurationRoot _ConfigurationRoot;
private readonly Property.Models.Configuration _PropertyConfiguration;
public Form()
{
InitializeComponent();
_Lines = new();
ILogger logger;
AppSettings appSettings;
string workingDirectory;
Configuration configuration;
IsEnvironment isEnvironment;
_IdToItem = new();
IConfigurationRoot configurationRoot;
LoggerConfiguration loggerConfiguration = new();
Property.Models.Configuration propertyConfiguration;
Assembly assembly = Assembly.GetExecutingAssembly();
bool debuggerWasAttachedAtLineZero = Debugger.IsAttached || assembly.Location.Contains(@"\bin\Debug");
isEnvironment = new(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: debuggerWasAttachedAtLineZero, nullASPNetCoreEnvironmentIsProduction: !debuggerWasAttachedAtLineZero);
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(isEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true);
configurationRoot = configurationBuilder.Build();
appSettings = Models.Binder.AppSettings.Get(configurationRoot);
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
throw new Exception("Working path name must have parentDirectory value!");
workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName);
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
Log.Logger = loggerConfiguration.CreateLogger();
logger = Log.ForContext<Form>();
propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
(_, _, string resizeFileNameExtension) = C_Resize.GetTuple(configuration.OutputExtension, configuration.OutputQuality);
logger.Information("Complete");
_Logger = logger;
_AppSettings = appSettings;
_Configuration = configuration;
_IsEnvironment = isEnvironment;
_WorkingDirectory = workingDirectory;
_ConfigurationRoot = configurationRoot;
_PropertyConfiguration = propertyConfiguration;
_ResizeFileNameExtension = resizeFileNameExtension;
_TextBox = new() { Location = new(5, 5), Dock = DockStyle.Top };
_ProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
_InnerProgressBar = new() { Location = new(5, 5), Dock = DockStyle.Top, Visible = false };
Load += new EventHandler(Form1_Load);
Controls.Add(_ProgressBar);
Controls.Add(_InnerProgressBar);
Controls.Add(_TextBox);
}
void Form1_Load(object? sender, EventArgs e)
{
try
{
AllowDrop = true;
DragDrop += new DragEventHandler(Form1_DragDrop);
DragEnter += new DragEventHandler(Form1_DragEnter);
_TextBox.LostFocus += new EventHandler(TextBox_LostFocus);
}
catch (Exception)
{
throw;
}
}
void TextBox_LostFocus(object? sender, EventArgs e)
{
try
{
if (_TextBox.Text == "ps")
throw new NotImplementedException();
}
catch (Exception)
{
throw;
}
}
void Form1_DragEnter(object? sender, DragEventArgs e)
{
try
{
if (e.Data is not null && e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
}
catch (Exception)
{
throw;
}
}
void LoadData()
{
Container[] containers;
Property.Models.A_Property propertyLogic = new(_AppSettings.MaxDegreeOfParallelism, _Configuration.PropertyConfiguration, _ResizeFileNameExtension, _Configuration.Reverse);
(_, _, _, containers) = Property.Models.Stateless.Container.GetContainers(_Configuration.PropertyConfiguration, propertyLogic);
List<Item> collection = Program.GetItemCollection(_Configuration, containers);
foreach (Item item in collection)
{
if (item.Property?.Id is null)
continue;
if (_IdToItem.ContainsKey(item.Property.Id.Value))
continue;
_IdToItem.Add(item.Property.Id.Value, item);
}
if (_Logger is null)
throw new NullReferenceException(nameof(_Logger));
_Logger.Debug((_AppSettings is null).ToString());
_Logger.Debug((_Configuration is null).ToString());
_Logger.Debug((_IsEnvironment is null).ToString());
_Logger.Debug((_WorkingDirectory is null).ToString());
_Logger.Debug((_ConfigurationRoot is null).ToString());
_Logger.Debug((_PropertyConfiguration is null).ToString());
}
public static string? GetFaceEncoding(string file)
{
string? result;
List<string> results = new();
const string comment = "Comment: ";
if (File.Exists(file))
{
IReadOnlyList<MetadataExtractor.Directory> directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
foreach (MetadataExtractor.Directory directory in directories)
{
if (directory.Name != "PNG-tEXt")
continue;
foreach (MetadataExtractor.Tag tag in directory.Tags)
{
if (tag.Name != "Textual Data" || string.IsNullOrEmpty(tag.Description))
continue;
if (!tag.Description.StartsWith(comment))
continue;
results.Add(tag.Description);
}
}
}
result = results.Any() ? results[0][comment.Length..] : null;
return result;
}
private void RenameFilesInDirectory(string directory, string searchPattern)
{
int? id;
string? message;
string checkFile;
TimeSpan timeSpan;
DateTime? dateTime;
DateTime?[] dateTimes;
FileHolder fileHolder;
bool isIgnoreExtension;
string checkFileExtension;
DateTime? minimumDateTime;
const string jpg = ".jpg";
_InnerProgressBar.Step = 1;
_InnerProgressBar.Value = 0;
const string jpeg = ".jpeg";
_InnerProgressBar.Visible = true;
bool isValidImageFormatExtension;
bool nameWithoutExtensionIsIdFormat;
IReadOnlyList<MetadataExtractor.Directory> directories;
string[] files = Directory.GetFiles(directory, searchPattern, SearchOption.TopDirectoryOnly);
if (files.All(l => l.EndsWith(".id")))
{
foreach (string file in files)
File.Delete(file);
}
_InnerProgressBar.Maximum = files.Length;
foreach (string file in files)
{
_InnerProgressBar.PerformStep();
fileHolder = new(file);
_Lines.Add(fileHolder.NameWithoutExtension);
if (fileHolder.ExtensionLowered == ".id" || fileHolder.DirectoryName is null)
continue;
if (files.Contains($"{fileHolder.FullName}.id"))
continue;
isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
isIgnoreExtension = isValidImageFormatExtension && _Configuration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
nameWithoutExtensionIsIdFormat = IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
if (!isIgnoreExtension && isValidImageFormatExtension)
{
if (fileHolder.ExtensionLowered == jpeg)
{
if (File.Exists($"{fileHolder.FullName}.id"))
File.Move($"{fileHolder.FullName}.id", Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}.id"));
File.Move(fileHolder.FullName, Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}"));
}
if (nameWithoutExtensionIsIdFormat)
continue;
}
(dateTimes, id, message) = IProperty.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension);
minimumDateTime = dateTimes.Min();
if (minimumDateTime is null || !isIgnoreExtension && isValidImageFormatExtension)
{
dateTime = IProperty.GetDateTimeFromName(fileHolder);
if (dateTime is null || minimumDateTime is null)
timeSpan = new TimeSpan(0);
else
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTime.Value.Ticks));
}
else
{
if (!int.TryParse(Path.GetFileName(fileHolder.DirectoryName)[..4], out int year))
year = minimumDateTime.Value.Year;
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(dateTimes, year, directories);
timeSpan = new TimeSpan(int.MaxValue);
}
if (dateTime is not null && timeSpan.TotalMinutes > 2)
{
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}{checkFileExtension}");
if (checkFile == fileHolder.FullName)
continue;
for (int i = 0; i < int.MaxValue; i++)
{
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks + i}{checkFileExtension}");
if (File.Exists(checkFile))
continue;
break;
}
if (File.Exists(checkFile))
continue;
File.Move(fileHolder.FullName, checkFile);
File.WriteAllText($"{checkFile}.id", $"{checkFile}{Environment.NewLine}{fileHolder.Name}");
continue;
}
if (id is null)
continue;
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(fileHolder.DirectoryName, $"{id.Value}{checkFileExtension}");
if (checkFile == fileHolder.FullName || File.Exists(checkFile))
continue;
File.Move(fileHolder.FullName, checkFile);
File.WriteAllText($"{checkFile}.id", $"{checkFile}{Environment.NewLine}{fileHolder.Name}");
}
_InnerProgressBar.Visible = false;
}
private List<(string, FaceDistance)> GetFileAndFaceDistanceCollection(string[] files)
{
// int? id;
string? json;
// string? message;
// DateTime? dateTime;
// FileHolder fileHolder;
// bool isIgnoreExtension;
// DateTime? minimumDateTime;
FaceDistance faceDistance;
// bool isValidImageFormatExtension;
List<(string, FaceDistance)> collection = new();
Shared.Models.FaceEncoding? modelsFaceEncoding;
IReadOnlyList<MetadataExtractor.Directory> directories;
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding;
_ProgressBar.Maximum = files.Length;
foreach (string file in files)
{
_ProgressBar.PerformStep();
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(directories);
if (json is null)
break;
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
if (modelsFaceEncoding is null)
throw new NotSupportedException();
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
faceDistance = new(faceRecognitionDotNetFaceEncoding);
collection.Add(new(file, faceDistance));
// fileHolder = new(file);
// _Lines.Add(fileHolder.NameWithoutExtension);
// isValidImageFormatExtension = _Configuration.PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
// isIgnoreExtension = isValidImageFormatExtension && _Configuration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
// if (isIgnoreExtension || !isValidImageFormatExtension)
// continue;
// if (fileHolder.CreationTime is null || fileHolder.Name.Contains(fileHolder.CreationTime.Value.ToString("yy")))
// continue;
// if (fileHolder.LastWriteTime is null || fileHolder.Name.Contains(fileHolder.LastWriteTime.Value.ToString("yy")))
// continue;
// if (fileHolder.NameWithoutExtension.Length == 1 || fileHolder.NameWithoutExtension[1..].All(l => char.IsNumber(l)))
// continue;
// if (fileHolder.DirectoryName is null)
// continue;
// dateTime = IProperty.GetDateTimeFromName(fileHolder);
// if (dateTime is not null && fileHolder.Name.Contains(dateTime.Value.ToString("yy")))
// continue;
// (minimumDateTime, id, message) = IProperty.Get(fileHolder);
// if (minimumDateTime is null || id is null)
// continue;
// if (fileHolder.Name.Contains(minimumDateTime.Value.ToString("yy")))
// continue;
// if (dateTime is not null && minimumDateTime.Value != dateTime.Value)
// continue;
}
return collection;
}
private static List<(string File, double? Sum)> GetFileAndSum(List<(string File, FaceDistance FaceDistance)> collection)
{
List<(string File, double? Sum)> results = new();
List<double?> lengths = new();
List<FaceDistance> faceDistanceLengths;
int take = (int)(collection.Count * .3333);
List<FaceDistance> faceDistances = collection.Select(l => l.FaceDistance).ToList();
foreach ((string file, FaceDistance faceDistance) in collection)
{
lengths.Clear();
faceDistanceLengths = FaceRecognition.FaceDistances(faceDistances, faceDistance);
if (faceDistanceLengths.Count != faceDistances.Count)
throw new NotSupportedException();
lengths.AddRange(from l in faceDistanceLengths orderby l.Length is not null, l.Length select l.Length);
results.Add(new(file, lengths.Take(take).Sum()));
}
return results;
}
private void ChangeDate(string directory, DateTime dateTime, string searchPattern)
{
string[] files = Directory.GetFiles(directory, searchPattern, SearchOption.TopDirectoryOnly);
_ProgressBar.Step = 1;
_ProgressBar.Value = 0;
_ProgressBar.Visible = true;
List<(string File, double? Sum)> results;
List<(string File, FaceDistance FaceDistance)> collection = GetFileAndFaceDistanceCollection(files);
_ProgressBar.Maximum = files.Length;
if (collection.Count != files.Length)
results = new();
else
results = GetFileAndSum(collection);
if (results.Count == files.Length)
{
foreach ((string file, double? sum) in results)
{
if (sum is null)
continue;
File.SetCreationTime(file, dateTime.AddSeconds(sum.Value));
}
}
if (results.Count == files.Length)
{ }
}
private List<DateTime> GetBirthDates(string directory)
{
List<DateTime> results = new();
string[] directoryNames = IPath.GetDirectoryNames(directory);
foreach (string directoryName in directoryNames)
{
if (directoryName.Length != _Configuration.PersonBirthdayFormat.Length)
continue;
if (!DateTime.TryParseExact(directoryName, _Configuration.PersonBirthdayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dateTime))
continue;
results.Add(dateTime);
}
return results;
}
private static void Rename2000(string[] paths)
{
string name;
string check;
string? directoryName;
foreach (string path in paths)
{
name = Path.GetFileName(path).Trim();
if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20") && !name.StartsWith("#20")))
// if (name.Length < 1 || !name.Contains(".Z.#20"))
continue;
directoryName = Path.GetDirectoryName(path);
if (directoryName is null)
continue;
if (name.StartsWith("=20") || name.StartsWith("#20"))
check = Path.Combine(directoryName, name[1..]);
else
check = Path.Combine(directoryName, $"zzz {name[5..]}");
// check = Path.Combine(directoryName, name.Replace("#", string.Empty));
if (Directory.Exists(check) || File.Exists(check))
continue;
if (!Directory.Exists(path))
File.Move(path, check);
else
Directory.Move(path, check);
}
}
private void RenameFilesInDirectories(List<string> directories)
{
string directoryName;
ReadOnlySpan<char> span;
_ProgressBar.Step = 1;
_ProgressBar.Visible = true;
_ProgressBar.Maximum = directories.Count;
for (int i = 1; i < 3; i++)
{
_ProgressBar.Value = 0;
foreach (string directory in directories)
{
_ProgressBar.PerformStep();
if (directory.Length < 6)
continue;
directoryName = Path.GetFileName(directory);
if (directory.Contains("!---"))
span = "0";
else
span = directory.AsSpan(directory.Length - 5, 3);
if (directoryName.Length != 1 || !int.TryParse(span, out int age))
{
if (i == 1)
RenameFilesInDirectory(directory, "*Rename*");
else if (i == 2)
RenameFilesInDirectory(directory, "*");
else
continue;
}
else
{
if (i == 1)
{
List<DateTime> birthDates = GetBirthDates(directory);
if (birthDates.Count != 1)
continue;
ChangeDate(directory, birthDates[0].AddYears(age), "*");
}
else
continue;
}
}
}
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", _Lines);
_Lines.Clear();
_ProgressBar.Visible = false;
}
private static void MoveMatches(string argZero)
{
string moveDirectory;
string checkDirectory;
int length = argZero.Length;
string compareDirectory = "D:/";
string[] directories = Directory.GetDirectories(argZero, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
if (!string.IsNullOrEmpty(directory))
continue;
checkDirectory = string.Concat(compareDirectory, directory[length..]);
if (!Directory.Exists(checkDirectory))
continue;
moveDirectory = string.Concat(compareDirectory[..^1], directory[length..]);
Directory.Move(checkDirectory, moveDirectory);
}
}
private List<string> GetDirectoriesOrDoDragDrop(string[] paths)
{
List<string> results = new();
string name;
string[] segments;
foreach (string path in paths)
{
name = Path.GetFileNameWithoutExtension(path);
Text = name;
segments = name.Split('.');
if (Directory.Exists(path))
{
results.Add(path);
results.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories));
}
else
{
if (!_IdToItem.Any())
LoadData();
if (int.TryParse(segments[0], out int id) && _IdToItem.TryGetValue(id, out Item? item))
{
Text = item.ImageFileHolder.Name;
_TextBox.Text = item.ImageFileHolder.FullName;
if (item.ImageFileHolder.DirectoryName is not null)
_Logger.Information(item.ImageFileHolder.DirectoryName);
if (!string.IsNullOrEmpty(item.ImageFileHolder.DirectoryName))
_ = Process.Start("explorer.exe", string.Concat("\"", item.ImageFileHolder.DirectoryName, "\""));
}
}
}
return results;
}
void Form1_DragDrop(object? sender, DragEventArgs e)
{
try
{
if (e.Data is null || e.Data.GetData(DataFormats.FileDrop) is not string[] paths)
_TextBox.Text = string.Empty;
else
{
if (paths.Length == 0 && paths[0].Contains("~~~"))
MoveMatches(paths[0]);
else if (paths.All(l => l.Contains("=20")) || paths.All(l => l.Contains("#20")))
// if (paths.All(l => l.Contains('#')))
Rename2000(paths);
else
{
List<string> directories = GetDirectoriesOrDoDragDrop(paths);
if (directories.Any())
{
RenameFilesInDirectories(directories);
string? parentDirectory = Path.GetDirectoryName(directories[0]);
if (parentDirectory is not null && parentDirectory != Path.GetPathRoot(directories[0]))
_ = IPath.DeleteEmptyDirectories(parentDirectory);
}
}
}
}
catch (Exception)
{
throw;
}
}
}

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Duplicate-Search</PackageId> <PackageId>Phares.View.by.Distance.Duplicate-Search</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Face</PackageId> <PackageId>Phares.View.by.Distance.Face</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.FaceParts</PackageId> <PackageId>Phares.View.by.Distance.FaceParts</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.FaceRecognitionDotNet</PackageId> <PackageId>Phares.View.by.Distance.FaceRecognitionDotNet</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Instance</PackageId> <PackageId>Phares.View.by.Distance.Instance</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Map</PackageId> <PackageId>Phares.View.by.Distance.Map</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Metadata</PackageId> <PackageId>Phares.View.by.Distance.Metadata</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Not.Copy.Copy</PackageId> <PackageId>Phares.View.by.Distance.Not.Copy.Copy</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.PhotoPrism</PackageId> <PackageId>Phares.View.by.Distance.PhotoPrism</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.PrepareForOld</PackageId> <PackageId>Phares.View.by.Distance.PrepareForOld</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Property.Compare</PackageId> <PackageId>Phares.View.by.Distance.Property.Compare</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Property</PackageId> <PackageId>Phares.View.by.Distance.Property</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

26
Rename/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/bin/Debug/net7.0/win-x64/Rename.dll",
"args": [],
"cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "internalConsole",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

View File

@ -7,7 +7,7 @@
"type": "process", "type": "process",
"args": [ "args": [
"build", "build",
"${workspaceFolder}/Drag-Drop.csproj", "${workspaceFolder}/Rename.csproj",
"/property:GenerateFullPaths=true", "/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary" "/consoleloggerparameters:NoSummary"
], ],
@ -19,7 +19,7 @@
"type": "process", "type": "process",
"args": [ "args": [
"publish", "publish",
"${workspaceFolder}/Drag-Drop.csproj", "${workspaceFolder}/Rename.csproj",
"/property:GenerateFullPaths=true", "/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary" "/consoleloggerparameters:NoSummary"
], ],
@ -33,7 +33,7 @@
"watch", "watch",
"run", "run",
"--project", "--project",
"${workspaceFolder}/Drag-Drop.csproj" "${workspaceFolder}/Rename.csproj"
], ],
"problemMatcher": "$msCompile" "problemMatcher": "$msCompile"
} }

View File

@ -0,0 +1,29 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Rename.Models;
public class AppSettings
{
public string Company { init; get; }
public string ComparePathsFile { init; get; }
public int MaxDegreeOfParallelism { init; get; }
public string WorkingDirectoryName { init; get; }
[JsonConstructor]
public AppSettings(string company, string comparePathsFile, int maxDegreeOfParallelism, string workingDirectoryName)
{
Company = company;
ComparePathsFile = comparePathsFile;
MaxDegreeOfParallelism = maxDegreeOfParallelism;
WorkingDirectoryName = workingDirectoryName;
}
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
return result;
}
}

View File

@ -0,0 +1,46 @@
using Microsoft.Extensions.Configuration;
using System.Text.Json;
namespace View_by_Distance.Rename.Models.Binder;
public class AppSettings
{
#nullable disable
public string Company { get; set; }
public string ComparePathsFile { get; set; }
public int? MaxDegreeOfParallelism { get; set; }
public string WorkingDirectoryName { get; set; }
#nullable restore
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
return result;
}
private static Models.AppSettings Get(AppSettings? appSettings)
{
Models.AppSettings result;
if (appSettings?.MaxDegreeOfParallelism is null)
throw new NullReferenceException(nameof(appSettings.MaxDegreeOfParallelism));
result = new(
appSettings.Company,
appSettings.ComparePathsFile,
appSettings.MaxDegreeOfParallelism.Value,
appSettings.WorkingDirectoryName
);
return result;
}
public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
{
Models.AppSettings result;
AppSettings? appSettings = configurationRoot.Get<AppSettings>();
result = Get(appSettings);
return result;
}
}

View File

@ -0,0 +1,59 @@
using Microsoft.Extensions.Configuration;
using Phares.Shared;
using System.ComponentModel.DataAnnotations;
using System.Text.Json;
namespace View_by_Distance.Rename.Models.Binder;
public class Configuration
{
#nullable disable
[Display(Name = "Ignore Extensions"), Required] public string[] IgnoreExtensions { get; set; }
[Display(Name = "Property Configuration"), Required] public Property.Models.Configuration PropertyConfiguration { get; set; }
[Display(Name = "Person Birthday Format"), Required] public string PersonBirthdayFormat { get; set; }
#nullable restore
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
return result;
}
private static Models.Configuration Get(Configuration? configuration)
{
Models.Configuration result;
if (configuration is null)
throw new NullReferenceException(nameof(configuration));
if (configuration.IgnoreExtensions is null)
throw new NullReferenceException(nameof(configuration.IgnoreExtensions));
if (configuration.PersonBirthdayFormat is null)
throw new NullReferenceException(nameof(configuration.PersonBirthdayFormat));
result = new(
configuration.IgnoreExtensions,
configuration.PersonBirthdayFormat,
configuration.PropertyConfiguration);
return result;
}
public static Models.Configuration Get(IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, Property.Models.Configuration propertyConfiguration)
{
Models.Configuration result;
Configuration? configuration;
if (isEnvironment is null)
configuration = configurationRoot.Get<Configuration>();
else
{
string environmentName = IsEnvironment.GetEnvironmentName(isEnvironment);
string section = string.Concat(environmentName, ":", nameof(Configuration));
IConfigurationSection configurationSection = configurationRoot.GetSection(section);
configuration = configurationSection.Get<Configuration>();
}
result = Get(configuration);
result.SetAndUpdate(propertyConfiguration);
return result;
}
}

View File

@ -0,0 +1,38 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Rename.Models;
public class Configuration
{
protected Property.Models.Configuration _PropertyConfiguration;
public string[] IgnoreExtensions { init; get; }
public string PersonBirthdayFormat { init; get; }
public Property.Models.Configuration PropertyConfiguration => _PropertyConfiguration;
[JsonConstructor]
public Configuration(
string[] ignoreExtensions,
string personBirthdayFormat,
Property.Models.Configuration propertyConfiguration)
{
IgnoreExtensions = ignoreExtensions;
PersonBirthdayFormat = personBirthdayFormat;
_PropertyConfiguration = propertyConfiguration;
}
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
return result;
}
public void SetAndUpdate(Property.Models.Configuration configuration)
{
_PropertyConfiguration = configuration;
_PropertyConfiguration.Update();
}
}

View File

@ -0,0 +1,10 @@
namespace View_by_Distance.Rename.Models.Stateless;
public static class SerilogExtensionMethods
{
internal static void Warn(this Serilog.ILogger log, string messageTemplate) => log.Warning(messageTemplate);
internal static void Info(this Serilog.ILogger log, string messageTemplate) => log.Information(messageTemplate);
}

70
Rename/Program.cs Normal file
View File

@ -0,0 +1,70 @@
using Microsoft.Extensions.Configuration;
using Phares.Shared;
using Serilog;
using System.Diagnostics;
using System.Reflection;
using View_by_Distance.Rename.Models;
using View_by_Distance.Shared.Models.Stateless.Methods;
namespace View_by_Distance.Rename;
public class Program
{
public static void Secondary(List<string> args)
{
LoggerConfiguration loggerConfiguration = new();
Assembly assembly = Assembly.GetExecutingAssembly();
bool debuggerWasAttachedAtLineZero = Debugger.IsAttached || assembly.Location.Contains(@"\bin\Debug");
IsEnvironment isEnvironment = new(processesCount: null, nullASPNetCoreEnvironmentIsDevelopment: debuggerWasAttachedAtLineZero, nullASPNetCoreEnvironmentIsProduction: !debuggerWasAttachedAtLineZero);
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(isEnvironment.AppSettingsFileName, optional: false, reloadOnChange: true);
IConfigurationRoot configurationRoot = configurationBuilder.Build();
AppSettings appSettings = Models.Binder.AppSettings.Get(configurationRoot);
if (appSettings.MaxDegreeOfParallelism > Environment.ProcessorCount)
throw new Exception("MaxDegreeOfParallelism must be =< Environment.ProcessorCount!");
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
throw new Exception("Working directory name must have a value!");
string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName().Name, appSettings.WorkingDirectoryName);
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, configurationRoot);
Log.Logger = loggerConfiguration.CreateLogger();
ILogger log = Log.ForContext<Program>();
int silentIndex = args.IndexOf("s");
if (silentIndex > -1)
args.RemoveAt(silentIndex);
try
{
if (args is null)
throw new Exception("args is null!");
Shared.Models.Console console = new();
_ = new Rename(args, isEnvironment, configurationRoot, appSettings, workingDirectory, silentIndex > -1, console);
}
catch (Exception ex)
{
log.Fatal(string.Concat(ex.Message, Environment.NewLine, ex.StackTrace));
}
finally
{
Log.CloseAndFlush();
}
if (silentIndex > -1)
log.Debug("Done. Bye");
else
{
log.Debug("Done. Press 'Enter' to end");
_ = Console.ReadLine();
}
}
public static void Main(string[] args)
{
if (args is not null)
Secondary(args.ToList());
else
Secondary(new List<string>());
}
}

270
Rename/Rename.cs Normal file
View File

@ -0,0 +1,270 @@
using Microsoft.Extensions.Configuration;
using Phares.Shared;
using Serilog;
using ShellProgressBar;
using View_by_Distance.Rename.Models;
using View_by_Distance.Shared.Models;
using View_by_Distance.Shared.Models.Methods;
namespace View_by_Distance.Rename;
public class Rename
{
private readonly AppSettings _AppSettings;
private readonly string _WorkingDirectory;
private readonly IsEnvironment _IsEnvironment;
private readonly Configuration _Configuration;
private readonly IConfigurationRoot _ConfigurationRoot;
private readonly Property.Models.Configuration _PropertyConfiguration;
public Rename(List<string> args, IsEnvironment isEnvironment, IConfigurationRoot configurationRoot, AppSettings appSettings, string workingDirectory, bool isSilent, IConsole console)
{
if (isSilent)
{ }
if (console is null)
{ }
_AppSettings = appSettings;
_IsEnvironment = isEnvironment;
long ticks = DateTime.Now.Ticks;
_WorkingDirectory = workingDirectory;
_ConfigurationRoot = configurationRoot;
ILogger? log = Log.ForContext<Rename>();
Dictionary<long, Dictionary<long, List<string>>> fileSizeToCollection = new();
Property.Models.Configuration propertyConfiguration = Property.Models.Binder.Configuration.Get(isEnvironment, configurationRoot);
Configuration configuration = Models.Binder.Configuration.Get(isEnvironment, configurationRoot, propertyConfiguration);
_PropertyConfiguration = propertyConfiguration;
_Configuration = configuration;
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
propertyConfiguration.Update();
string? comparePathRoot = Path.GetDirectoryName(appSettings.ComparePathsFile);
if (comparePathRoot is null || comparePathRoot == propertyConfiguration.RootDirectory)
throw new Exception("Nested isn't allowed!");
log.Information(propertyConfiguration.RootDirectory);
Verify();
string json = File.ReadAllText(appSettings.ComparePathsFile);
MatchNginx[]? matchNginxCollection = System.Text.Json.JsonSerializer.Deserialize<MatchNginx[]>(json);
if (matchNginxCollection is null)
throw new NullReferenceException(nameof(matchNginxCollection));
if (matchNginxCollection.Length == 0 && matchNginxCollection[0].ConvertedPath.Contains("~~~"))
MoveMatches(matchNginxCollection[0]);
else if (matchNginxCollection.All(l => l.Name.StartsWith("#")) || matchNginxCollection.All(l => l.Name.StartsWith(" #")) || matchNginxCollection.All(l => l.Name.StartsWith("=20")) || matchNginxCollection.All(l => l.Name.StartsWith("#20")))
Rename2000(matchNginxCollection);
else if (matchNginxCollection.Any())
{
List<string> lines = RenameFilesInDirectories(options, matchNginxCollection);
File.WriteAllLines($"D:/Tmp/Phares/{DateTime.Now.Ticks}.tsv", lines);
if (comparePathRoot != Path.GetPathRoot(matchNginxCollection[0].ConvertedPath))
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(comparePathRoot);
}
}
private void Verify()
{
if (_AppSettings is null)
{ }
if (_IsEnvironment is null)
{ }
if (_Configuration is null)
{ }
if (_ConfigurationRoot is null)
{ }
if (_WorkingDirectory is null)
{ }
}
private static void MoveMatches(MatchNginx matchNginx)
{
string moveDirectory;
string checkDirectory;
string compareDirectory = "D:/";
int length = matchNginx.ConvertedPath.Length;
string[] directories = Directory.GetDirectories(matchNginx.ConvertedPath, "*", SearchOption.TopDirectoryOnly);
foreach (string directory in directories)
{
if (!string.IsNullOrEmpty(directory))
continue;
checkDirectory = string.Concat(compareDirectory, directory[length..]);
if (!Directory.Exists(checkDirectory))
continue;
moveDirectory = string.Concat(compareDirectory[..^1], directory[length..]);
Directory.Move(checkDirectory, moveDirectory);
}
}
private (List<(FileHolder, string)>, int) RenameFilesInDirectory(ProgressBar progressBar, string[] files)
{
List<(FileHolder, string)> results = new();
int? id;
string? message;
string checkFile;
TimeSpan timeSpan;
DateTime? dateTime;
DateTime?[] dateTimes;
FileHolder fileHolder;
bool isIgnoreExtension;
string checkFileExtension;
DateTime? minimumDateTime;
const string jpg = ".jpg";
const string jpeg = ".jpeg";
bool isValidImageFormatExtension;
bool nameWithoutExtensionIsIdFormat;
List<string> distinctCollection = new();
IReadOnlyList<MetadataExtractor.Directory> directories;
foreach (string file in files)
{
progressBar.Tick();
fileHolder = new(file);
if (fileHolder.ExtensionLowered == ".id" || fileHolder.DirectoryName is null)
continue;
if (files.Contains($"{fileHolder.FullName}.id"))
continue;
isValidImageFormatExtension = _PropertyConfiguration.ValidImageFormatExtensions.Contains(fileHolder.ExtensionLowered);
isIgnoreExtension = isValidImageFormatExtension && _Configuration.IgnoreExtensions.Contains(fileHolder.ExtensionLowered);
nameWithoutExtensionIsIdFormat = Shared.Models.Stateless.Methods.IProperty.NameWithoutExtensionIsIdFormat(fileHolder);
if (!isIgnoreExtension && isValidImageFormatExtension)
{
if (fileHolder.ExtensionLowered == jpeg)
{
if (File.Exists($"{fileHolder.FullName}.id"))
File.Move($"{fileHolder.FullName}.id", Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}.id"));
File.Move(fileHolder.FullName, Path.Combine(fileHolder.DirectoryName, $"{fileHolder.NameWithoutExtension}{jpg}"));
}
if (nameWithoutExtensionIsIdFormat)
continue;
}
(dateTimes, id, message) = Shared.Models.Stateless.Methods.IProperty.Get(fileHolder, isIgnoreExtension, isValidImageFormatExtension);
minimumDateTime = dateTimes.Min();
if (minimumDateTime is null || !isIgnoreExtension && isValidImageFormatExtension)
{
dateTime = Shared.Models.Stateless.Methods.IProperty.GetDateTimeFromName(fileHolder);
if (dateTime is null || minimumDateTime is null)
timeSpan = new TimeSpan(0);
else
timeSpan = new(Math.Abs(minimumDateTime.Value.Ticks - dateTime.Value.Ticks));
}
else
{
if (!int.TryParse(Path.GetFileName(fileHolder.DirectoryName)[..4], out int year))
year = minimumDateTime.Value.Year;
try
{ directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file); }
catch (Exception) { continue; }
dateTime = Metadata.Models.Stateless.Methods.IMetadata.GetMinimumDateTime(dateTimes, year, directories);
timeSpan = new TimeSpan(int.MaxValue);
}
if (dateTime is not null && timeSpan.TotalMinutes > 2)
{
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
if (!isIgnoreExtension && isValidImageFormatExtension)
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}{checkFileExtension}");
else
checkFile = Path.Combine(fileHolder.DirectoryName, $"{dateTime.Value:yyyy-MM-dd}.{dateTime.Value.Ticks}.{fileHolder.Length}{checkFileExtension}");
if (checkFile == fileHolder.FullName)
continue;
if (distinctCollection.Contains(checkFile))
continue;
distinctCollection.Add(checkFile);
results.Add(new(fileHolder, checkFile));
continue;
}
if (id is null)
continue;
checkFileExtension = fileHolder.ExtensionLowered == jpeg ? jpg : fileHolder.ExtensionLowered;
checkFile = Path.Combine(fileHolder.DirectoryName, $"{id.Value}{checkFileExtension}");
if (checkFile == fileHolder.FullName || File.Exists(checkFile))
continue;
if (distinctCollection.Contains(checkFile))
continue;
results.Add(new(fileHolder, checkFile));
}
return new(results, distinctCollection.Count);
}
private static void Rename2000(MatchNginx[] matchNginxCollection)
{
string name;
string check;
string? directoryName;
foreach (MatchNginx matchNginx in matchNginxCollection)
{
name = matchNginx.Name.Trim();
if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20") && !name.StartsWith("#20")))
// if (name.Length < 1 || !name.Contains(".Z.#20"))
continue;
directoryName = Path.GetDirectoryName(matchNginx.ConvertedPath);
if (directoryName is null)
continue;
if (name.StartsWith("=20") || name.StartsWith("#20"))
check = Path.Combine(directoryName, name[1..]);
else
check = Path.Combine(directoryName, $"zzz {name[5..]}");
// check = Path.Combine(directoryName, name.Replace("#", string.Empty));
if (Directory.Exists(check) || File.Exists(check))
continue;
if (!Directory.Exists(matchNginx.ConvertedPath))
File.Move(matchNginx.ConvertedPath, check);
else
Directory.Move(matchNginx.ConvertedPath, check);
}
}
private static List<string> GetAllFiles(MatchNginx[] matchNginxCollection)
{
List<string> allFiles = new();
string[] files;
string directoryName;
ReadOnlySpan<char> span;
foreach (MatchNginx matchNginx in matchNginxCollection)
{
if (matchNginx.ConvertedPath.Length < 6)
continue;
directoryName = Path.GetFileName(matchNginx.ConvertedPath);
if (matchNginx.ConvertedPath.Contains("!---"))
span = "0";
else
span = matchNginx.ConvertedPath.AsSpan(matchNginx.ConvertedPath.Length - 5, 3);
if (directoryName.Length == 1 && int.TryParse(span, out int age))
continue;
if (File.Exists(matchNginx.ConvertedPath))
continue;
files = Directory.GetFiles(matchNginx.ConvertedPath, "*", SearchOption.TopDirectoryOnly);
if (files.All(l => l.EndsWith(".id")))
{
foreach (string file in files)
File.Delete(file);
continue;
}
allFiles.AddRange(files);
}
return allFiles;
}
private List<string> RenameFilesInDirectories(ProgressBarOptions options, MatchNginx[] matchNginxCollection)
{
List<string> results = new();
string[] files;
int distinctCount;
string message = "Renaming files";
List<(FileHolder, string)> renameCollection;
List<string> allFiles = GetAllFiles(matchNginxCollection);
using ProgressBar progressBar = new(matchNginxCollection.Length * 2, message, options);
for (int i = 1; i < 3; i++)
{
files = i == 2 ? allFiles.ToArray() : (from l in allFiles where l.Contains("Rename") select l).ToArray();
(renameCollection, distinctCount) = RenameFilesInDirectory(progressBar, files);
foreach ((FileHolder fileHolder, string to) in renameCollection)
{
results.Add(fileHolder.NameWithoutExtension);
if (renameCollection.Count != distinctCount)
continue;
if (File.Exists(to))
continue;
File.Move(fileHolder.FullName, to);
File.WriteAllText($"{to}.id", $"{to}{Environment.NewLine}{fileHolder.FullName}");
}
}
return results;
}
}

60
Rename/Rename.csproj Normal file
View File

@ -0,0 +1,60 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>10.0</LangVersion>
<Nullable>enable</Nullable>
<OutputType>WinExe</OutputType>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<TargetFramework>net7.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<PackageId>Phares.View.by.Distance.Rename</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors>
<Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
<PropertyGroup>
<IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows>
<IsOSX Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' == 'true'">true</IsOSX>
<IsLinux Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">true</IsLinux>
</PropertyGroup>
<PropertyGroup Condition="'$(IsWindows)'=='true'">
<DefineConstants>Windows</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(IsOSX)'=='true'">
<DefineConstants>OSX</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(IsLinux)'=='true'">
<DefineConstants>Linux</DefineConstants>
</PropertyGroup>
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'browser-wasm'">
<SupportedPlatform Include="browser" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Humanizer.Core" Version="2.14.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Serilog" Version="2.12.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Metadata\Metadata.csproj" />
<ProjectReference Include="..\Property\Property.csproj" />
<ProjectReference Include="..\Resize\Resize.csproj" />
<ProjectReference Include="..\Shared\View-by-Distance.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<None Include="appsettings.Development.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,18 @@
{
"ComparePathsFile": "C:/Users/mikep/AppData/Local/PharesApps/Drag-Drop-Explorer/2023_01/638082668201867717.json",
"Logging": {
"LogLevel": {
"Log4netProvider": "Debug"
}
},
"MaxDegreeOfParallelism": 6,
"Serilog": {
"MinimumLevel": "Debug"
},
"Windows": {
"Configuration": {
"RootDirectory": "C:/",
"VerifyToSeason": []
}
}
}

118
Rename/appsettings.json Normal file
View File

@ -0,0 +1,118 @@
{
"ComparePathsFile": "",
"Company": "Mike Phares",
"Linux": {},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Log4netProvider": "Debug",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"MaxDegreeOfParallelism": 6,
"Serilog": {
"Using": [
"Serilog.Sinks.Console",
"Serilog.Sinks.File"
],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Debug",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}"
}
},
{
"Name": "Console",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "%workingDirectory% - Log/log-.txt",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}",
"rollingInterval": "Hour"
}
}
],
"Enrich": [
"FromLogContext",
"WithMachineName",
"WithThreadId"
],
"Properties": {
"Application": "Sample"
}
},
"WorkingDirectoryName": "PharesApps",
"Windows": {
"Configuration": {
"DateGroup": "45f4401",
"DiffPropertyDirectory": "",
"FileNameDirectorySeparator": ".Z.",
"ForcePropertyLastWriteTimeToCreationTime": false,
"MaxImagesInDirectoryForTopLevelFirstPass": 10,
"OutputExtension": ".jpg",
"Pattern": "[^ABCDEFGHIJKLMNOPQRSTUVWXYZbcdfghjklmnpqrstvwxyz0-9]",
"PersonBirthdayFormat": "yyyy-MM-dd_HH",
"PopulatePropertyId": true,
"PropertiesChangedForProperty": false,
"ResultAllInOne": "_ _ _",
"ResultCollection": "[]",
"ResultContent": "()",
"ResultSingleton": "{}",
"RootDirectory": "C:/Tmp/Phares/Compare/Images-45f4401",
"WriteBitmapDataBytes": false,
"IgnoreExtensions": [
".gif",
".GIF"
],
"ValidImageFormatExtensions": [
".bmp",
".BMP",
".gif",
".GIF",
".jpeg",
".JPEG",
".jpg",
".JPG",
".png",
".PNG",
".tiff",
".TIFF"
],
"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"
]
}
}
}

View File

@ -10,7 +10,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Resize</PackageId> <PackageId>Phares.View.by.Distance.Resize</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -1,4 +1,4 @@
namespace View_by_Distance.Drag_Drop_Explorer; namespace View_by_Distance.Shared.Models;
public record MatchNginx(string Name, string Type, DateTime MTime, long Size, string ConvertedPath) public record MatchNginx(string Name, string Type, DateTime MTime, long Size, string ConvertedPath)
{ } { }

View File

@ -9,7 +9,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>Phares.View.by.Distance.Shared</PackageId> <PackageId>Phares.View.by.Distance.Shared</PackageId>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild> <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<Version>6.0.100.1</Version> <Version>7.0.101.1</Version>
<Authors>Mike Phares</Authors> <Authors>Mike Phares</Authors>
<Company>Phares</Company> <Company>Phares</Company>
<IncludeSymbols>true</IncludeSymbols> <IncludeSymbols>true</IncludeSymbols>

View File

@ -80,6 +80,8 @@ public partial class UnitTestCalculations
{ {
PersonBirthday personBirthday = new(new(1980, 1, 17)); PersonBirthday personBirthday = new(new(1980, 1, 17));
double? age = IPersonBirthday.GetAge(personBirthday); double? age = IPersonBirthday.GetAge(personBirthday);
if (age is null)
throw new NullReferenceException(nameof(age));
Assert.IsNotNull(age); Assert.IsNotNull(age);
Assert.IsTrue(age.Value > 42.6092); Assert.IsTrue(age.Value > 42.6092);
} }

View File

@ -3,49 +3,51 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105 VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "View-by-Distance.Shared", "shared\View-by-Distance.Shared.csproj", "{1D231660-33B4-4763-9C9F-C6ACC8BA600D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Date-Group", "Date-Group\Date-Group.csproj", "{DFEDB5F9-AFFC-40A2-9FEC-9B84C83B63D9}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Date-Group", "Date-Group\Date-Group.csproj", "{DFEDB5F9-AFFC-40A2-9FEC-9B84C83B63D9}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Metadata", "Metadata\Metadata.csproj", "{961D11A0-44C8-48CD-BEEE-A6E6903AE58F}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Distinct", "Delete-By-Distinct\Delete-By-Distinct.csproj", "{3F00BDD5-75F8-470C-ACED-1A26FDC8D7B3}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Not-Copy-Copy", "Not-Copy-Copy\Not-Copy-Copy.csproj", "{BF81D265-36E3-4DCA-891B-A0D875C1E68A}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Relative", "Delete-By-Relative\Delete-By-Relative.csproj", "{9DFCA595-80AA-4E78-A9AF-5B4AB4D737C4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrepareForOld", "PrepareForOld\PrepareForOld.csproj", "{F73F9468-0139-4B05-99CE-C6C0403D03E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property", "Property\Property.csproj", "{964B969A-719C-48AF-86C0-F97AF1397347}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property-Compare", "Property-Compare\Property-Compare.csproj", "{692AA058-F142-44B0-88BC-F22AB5BE5EDF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Resize", "Resize\Resize.csproj", "{27D0D869-394D-4B07-83DF-2095B16026FC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{B4FB6B43-36EC-404D-B934-5C695C6E32CC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceRecognitionDotNet", "FaceRecognitionDotNet\FaceRecognitionDotNet.csproj", "{FAD03DA9-E8B1-4BBE-B8D0-2ADD2F2BC758}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsWithFaceRecognitionDotNet", "TestsWithFaceRecognitionDotNet\TestsWithFaceRecognitionDotNet.csproj", "{A67D73C7-A1A1-4443-B681-776339CFA08A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Map", "Map\Map.csproj", "{960BBED6-BF2C-4337-8330-F858606F4343}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Instance", "Instance\Instance.csproj", "{8085C1EE-C4DB-43DE-8888-1C956D69CF91}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Distance", "Distance\Distance.csproj", "{8D444B55-933C-40CD-B7FC-226136F16138}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Distance", "Distance\Distance.csproj", "{8D444B55-933C-40CD-B7FC-226136F16138}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop-Explorer", "Drag-Drop-Explorer\Drag-Drop-Explorer.csproj", "{986B009B-2937-4624-AC9C-13806868DB8C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop-Search", "Drag-Drop-Search\Drag-Drop-Search.csproj", "{87EB76BC-32A9-4FD0-922A-BD7E9B6E7D8B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicate-Search", "Duplicate-Search\Duplicate-Search.csproj", "{48E87D9B-B802-467A-BDC7-E86F7FD01D5C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Face", "Face\Face.csproj", "{A12E19E5-59C0-40D4-B807-DF1334D4906D}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Face", "Face\Face.csproj", "{A12E19E5-59C0-40D4-B807-DF1334D4906D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceParts", "FaceParts\FaceParts.csproj", "{919525B1-60BA-40C6-BA66-6F7F4C526E01}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceParts", "FaceParts\FaceParts.csproj", "{919525B1-60BA-40C6-BA66-6F7F4C526E01}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop", "Drag-Drop\Drag-Drop.csproj", "{87EB76BC-32A9-4FD0-922A-BD7E9B6E7D8B}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FaceRecognitionDotNet", "FaceRecognitionDotNet\FaceRecognitionDotNet.csproj", "{FAD03DA9-E8B1-4BBE-B8D0-2ADD2F2BC758}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicate-Search", "Duplicate-Search\Duplicate-Search.csproj", "{48E87D9B-B802-467A-BDC7-E86F7FD01D5C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Instance", "Instance\Instance.csproj", "{8085C1EE-C4DB-43DE-8888-1C956D69CF91}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Relative", "Delete-By-Relative\Delete-By-Relative.csproj", "{9DFCA595-80AA-4E78-A9AF-5B4AB4D737C4}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Map", "Map\Map.csproj", "{960BBED6-BF2C-4337-8330-F858606F4343}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Delete-By-Distinct", "Delete-By-Distinct\Delete-By-Distinct.csproj", "{3F00BDD5-75F8-470C-ACED-1A26FDC8D7B3}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Metadata", "Metadata\Metadata.csproj", "{961D11A0-44C8-48CD-BEEE-A6E6903AE58F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Not-Copy-Copy", "Not-Copy-Copy\Not-Copy-Copy.csproj", "{BF81D265-36E3-4DCA-891B-A0D875C1E68A}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhotoPrism", "PhotoPrism\PhotoPrism.csproj", "{DF4B0776-E0E5-4220-8721-8D1E491FF263}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhotoPrism", "PhotoPrism\PhotoPrism.csproj", "{DF4B0776-E0E5-4220-8721-8D1E491FF263}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Drag-Drop-Explorer", "Drag-Drop-Explorer\Drag-Drop-Explorer.csproj", "{986B009B-2937-4624-AC9C-13806868DB8C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrepareForOld", "PrepareForOld\PrepareForOld.csproj", "{F73F9468-0139-4B05-99CE-C6C0403D03E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property-Compare", "Property-Compare\Property-Compare.csproj", "{692AA058-F142-44B0-88BC-F22AB5BE5EDF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Property", "Property\Property.csproj", "{964B969A-719C-48AF-86C0-F97AF1397347}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rename", "Rename\Rename.csproj", "{83FD089F-8034-4597-B87F-87D343C0486B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Resize", "Resize\Resize.csproj", "{27D0D869-394D-4B07-83DF-2095B16026FC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{B4FB6B43-36EC-404D-B934-5C695C6E32CC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsWithFaceRecognitionDotNet", "TestsWithFaceRecognitionDotNet\TestsWithFaceRecognitionDotNet.csproj", "{A67D73C7-A1A1-4443-B681-776339CFA08A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "View-by-Distance.Shared", "shared\View-by-Distance.Shared.csproj", "{1D231660-33B4-4763-9C9F-C6ACC8BA600D}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -144,5 +146,9 @@ Global
{986B009B-2937-4624-AC9C-13806868DB8C}.Debug|Any CPU.Build.0 = Debug|Any CPU {986B009B-2937-4624-AC9C-13806868DB8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{986B009B-2937-4624-AC9C-13806868DB8C}.Release|Any CPU.ActiveCfg = Release|Any CPU {986B009B-2937-4624-AC9C-13806868DB8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{986B009B-2937-4624-AC9C-13806868DB8C}.Release|Any CPU.Build.0 = Release|Any CPU {986B009B-2937-4624-AC9C-13806868DB8C}.Release|Any CPU.Build.0 = Release|Any CPU
{83FD089F-8034-4597-B87F-87D343C0486B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83FD089F-8034-4597-B87F-87D343C0486B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83FD089F-8034-4597-B87F-87D343C0486B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83FD089F-8034-4597-B87F-87D343C0486B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal