diff --git a/MaddoShared/ImageCreatorSharp.cs b/MaddoShared/ImageCreatorSharp.cs index 7fb4db2..4a241e2 100644 --- a/MaddoShared/ImageCreatorSharp.cs +++ b/MaddoShared/ImageCreatorSharp.cs @@ -680,6 +680,9 @@ public class ImageCreatorSharp(PicSettings picSettings, ILogger g2.Height ? NewthumbSize(g2.Width, g2.Height, picSettings.LarghezzaBig, "Larghezza") : NewthumbSize(g2.Width, g2.Height, picSettings.AltezzaBig, "Altezza"); using var imgOutputBig2 = new Bitmap(g2, imgState.ThumbSizeBig.Width, imgState.ThumbSizeBig.Height); - if (thisFormat.Equals(ImageFormat.Jpeg)) - SalvaImmagineCustomQuality(imgOutputBig2, Path.Combine(imgState.DestDir.FullName, imgState.NomeFileBig), picSettings.JpegQuality); + + if (!picSettings.OverwriteFiles && File.Exists(fileName)) + { + logger.LogInformation("Saltata foto {FileName}, esiste", fileName); + } else - imgOutputBig2.Save(Path.Combine(imgState.DestDir.FullName, imgState.NomeFileBig), thisFormat); - - //imgOutputBig2.Dispose(); - - //imgOutputBig.Dispose(); - //g2.Dispose(); + { + if (thisFormat.Equals(ImageFormat.Jpeg)) + SalvaImmagineCustomQuality(imgOutputBig2, fileName, picSettings.JpegQuality); + else + imgOutputBig2.Save(fileName, thisFormat); + } + } else { - // - if (thisFormat.Equals(ImageFormat.Jpeg)) - SalvaImmagineCustomQuality(imgOutputBig, Path.Combine(imgState.DestDir.FullName, imgState.NomeFileBig), picSettings.JpegQuality); + if (!picSettings.OverwriteFiles && File.Exists(fileName)) + { + logger.LogInformation("Saltata foto {FileName}, esiste", fileName); + } else - imgOutputBig.Save(Path.Combine(imgState.DestDir.FullName, imgState.NomeFileBig), thisFormat); - - //imgOutputBig.Dispose(); + { + if (thisFormat.Equals(ImageFormat.Jpeg)) + SalvaImmagineCustomQuality(imgOutputBig, fileName, picSettings.JpegQuality); + else + imgOutputBig.Save(fileName, thisFormat); + } } + image1Stream.Seek(0, SeekOrigin.Begin); if (!picSettings.CreaMiniature) return; if (!picSettings.AggiungiScritteMiniature) return; + using var g1 = picSettings.FotoGrandeDimOrigina ? (Image)imgOutputBig.Clone() : Image.FromStream(image1Stream); - //if (_picSettings.FotoGrandeDimOrigina == false) - // g1 = Image.FromStream(image1Stream); - ////g1 = System.Drawing.Image.FromFile(Path.Combine(DestDir.FullName, "Temp_" + NomeFileBig)); - //else - // g1 = (Image)imgOutputBig.Clone(); - //g1 = System.Drawing.Image.FromFile(Path.Combine(DestDir.FullName, NomeFileBig)); - using Bitmap imgOutputSmall = new Bitmap(g1, imgState.ThumbSizeSmall.Width, imgState.ThumbSizeSmall.Height); + + using var imgOutputSmall = new Bitmap(g1, imgState.ThumbSizeSmall.Width, imgState.ThumbSizeSmall.Height); + if (string.Equals(picSettings.DirectorySorgente, picSettings.DirectoryDestinazione, StringComparison.OrdinalIgnoreCase)) imgState.NomeFileSmall = imgState.NomeFileSmall.Substring(0, imgState.NomeFileSmall.Length - 4) + picSettings.Codice + imgState.NomeFileSmall.Substring(imgState.NomeFileSmall.Length - 4); - // - if (thisFormat.Equals(ImageFormat.Jpeg)) - SalvaImmagineCustomQuality(imgOutputSmall, Path.Combine(imgState.DestDir.FullName, imgState.NomeFileSmall), picSettings.JpegQualityMin); + + var tnFileName = Path.Combine(imgState.DestDir.FullName, imgState.NomeFileSmall); + + if (!picSettings.OverwriteFiles && File.Exists(tnFileName)) + { + logger.LogInformation("Saltata miniatura foto {TnFileName}, esiste", tnFileName); + } else - imgOutputSmall.Save(Path.Combine(imgState.DestDir.FullName, imgState.NomeFileSmall), thisFormat); - - //imgOutputSmall.Dispose(); - - //g1.Dispose(); - - //if (File.Exists(Path.Combine(DestDir.FullName, "Temp_" + NomeFileBig))) - // File.Delete(Path.Combine(DestDir.FullName, "Temp_" + NomeFileBig)); + { + if (thisFormat.Equals(ImageFormat.Jpeg)) + SalvaImmagineCustomQuality(imgOutputSmall, tnFileName, picSettings.JpegQualityMin); + else + imgOutputSmall.Save(tnFileName, thisFormat); + } } private void SalvaImmagineCustomQuality(Bitmap imageToSave, string nomeFileFinale, long quality) diff --git a/MaddoShared/PicSettings.cs b/MaddoShared/PicSettings.cs index 239dfb4..8df3136 100644 --- a/MaddoShared/PicSettings.cs +++ b/MaddoShared/PicSettings.cs @@ -64,4 +64,5 @@ public class PicSettings public bool FotoRuotaADestra { get; set; } = false; public bool FotoRuotaASinistra { get; set; } = false; public string TempMinText { get; set; } = string.Empty; + public bool OverwriteFiles { get; set; } = false; } \ No newline at end of file diff --git a/imagecatalog/DataModel.cs b/imagecatalog/DataModel.cs index e71f7cd..5fe6f82 100644 --- a/imagecatalog/DataModel.cs +++ b/imagecatalog/DataModel.cs @@ -77,6 +77,18 @@ namespace ImageCatalog_2 } } + private bool _overwriteImages; + + public bool OverwriteImages + { + get => _overwriteImages; + set + { + _overwriteImages = value; + NotifyPropertyChanged(); + } + } + private bool _uiEnabled = true; public bool UiEnabled diff --git a/imagecatalog/MainForm.Designer.cs b/imagecatalog/MainForm.Designer.cs index bf1e683..265c4cf 100644 --- a/imagecatalog/MainForm.Designer.cs +++ b/imagecatalog/MainForm.Designer.cs @@ -617,6 +617,7 @@ namespace ImageCatalog // // chkSovrascriviFile // + chkSovrascriviFile.DataBindings.Add(new Binding("Checked", bindingSource1, "OverwriteImages", true, DataSourceUpdateMode.OnPropertyChanged)); chkSovrascriviFile.AutoSize = true; chkSovrascriviFile.Location = new Point(21, 94); chkSovrascriviFile.Margin = new Padding(4, 5, 4, 5); diff --git a/imagecatalog/MainForm.cs b/imagecatalog/MainForm.cs index 17accea..63163af 100644 --- a/imagecatalog/MainForm.cs +++ b/imagecatalog/MainForm.cs @@ -128,7 +128,7 @@ public partial class MainForm private ConcurrentBag _results; - private void setDefaults() + private void SetDefaults() { //txtSorgente.Text = ""; Model.SourcePath = string.Empty; @@ -205,7 +205,7 @@ public partial class MainForm { bindingSource1.DataSource = Model; Application.EnableVisualStyles(); - setDefaults(); + SetDefaults(); // /* TODO ERROR: Skipped IfDirectiveTrivia */ // AllocConsole(); // /* TODO ERROR: Skipped EndIfDirectiveTrivia */ @@ -318,77 +318,77 @@ public partial class MainForm SaveFileDlg.Filter = "Setup (*.xml)|*.xml|All valid files (*.*)|*.*"; SaveFileDlg.FilterIndex = 0; SaveFileDlg.RestoreDirectory = true; - if (DialogResult.OK == SaveFileDlg.ShowDialog()) + if (DialogResult.OK != SaveFileDlg.ShowDialog()) return; + + var ilNome = SaveFileDlg.FileName; + _parametriSetup.NomeFileSetup = ilNome; + _parametriSetup.AggiornaParametro("DirSorgente", Model.SourcePath); + _parametriSetup.AggiornaParametro("DirDestinazione", Model.DestinationPath); + _parametriSetup.AggiornaParametro("DirSottoDirectory", chkAggiornaSottodirectory.Checked); + _parametriSetup.AggiornaParametro("DirDividiDestinazione", chkCreaSottocartelle.Checked); + _parametriSetup.AggiornaParametro("DirDividiNumFile", txtFilePerCartella.Text); + _parametriSetup.AggiornaParametro("DirDividiSuffisso", txtSuffissoCartelle.Text); + _parametriSetup.AggiornaParametro("DirDividiNumCifre", txtCifreContatore.Text); + if (rdbNumProgressiva.Checked == true) { - string IlNome = SaveFileDlg.FileName; - _parametriSetup.NomeFileSetup = IlNome; - _parametriSetup.AggiornaParametro("DirSorgente", Model.SourcePath); - _parametriSetup.AggiornaParametro("DirDestinazione", Model.DestinationPath); - _parametriSetup.AggiornaParametro("DirSottoDirectory", chkAggiornaSottodirectory.Checked); - _parametriSetup.AggiornaParametro("DirDividiDestinazione", chkCreaSottocartelle.Checked); - _parametriSetup.AggiornaParametro("DirDividiNumFile", txtFilePerCartella.Text); - _parametriSetup.AggiornaParametro("DirDividiSuffisso", txtSuffissoCartelle.Text); - _parametriSetup.AggiornaParametro("DirDividiNumCifre", txtCifreContatore.Text); - if (rdbNumProgressiva.Checked == true) - { - _parametriSetup.AggiornaParametro("DirDividiTipoNumerazione", "Progressiva"); - } - else - { - _parametriSetup.AggiornaParametro("DirDividiTipoNumerazione", "Files"); - } - - _parametriSetup.AggiornaParametro("MiniatureCrea", CheckBox1.Checked); - _parametriSetup.AggiornaParametro("MiniatureSuffisso", TextBox3.Text); - _parametriSetup.AggiornaParametro("MiniatureAltezza", TextBox5.Text); - _parametriSetup.AggiornaParametro("MiniatureLarghezza", TextBox6.Text); - _parametriSetup.AggiornaParametro("MiniatureAddScritta", RadioButton3.Checked); - _parametriSetup.AggiornaParametro("MiniatureAddOrario", RadioButton4.Checked); - _parametriSetup.AggiornaParametro("FotoAltezza", TextBox27.Text); - _parametriSetup.AggiornaParametro("FotoLarghezza", TextBox28.Text); - // SetupIni.AggiornaParametro("FotoCodice", TextBox13.Text) - // SetupIni.AggiornaParametro("FotoDimOriginali", CheckBox2.Checked) - - _parametriSetup.AggiornaParametro("FontDimensione", TextBox11.Text); - _parametriSetup.AggiornaParametro("FontDimensioneMiniatura", TextBox25.Text); - _parametriSetup.AggiornaParametro("FontBold", CheckBox3.Checked); - _parametriSetup.AggiornaParametro("FontNome", ComboBox3.Text); - _parametriSetup.AggiornaParametro("TestoTesto", Model.HorizontalText); - _parametriSetup.AggiornaParametro("TestoTrasparente", TextBox9.Text); - _parametriSetup.AggiornaParametro("TestoMargine", TextBox12.Text); - _parametriSetup.AggiornaParametro("TestoPosizione", ComboBox1.Text); - _parametriSetup.AggiornaParametro("TestoAllineamento", ComboBox2.Text); - _parametriSetup.AggiornaParametro("MarchioFile", TextBox10.Text); - _parametriSetup.AggiornaParametro("MarchioAltezza", TextBox14.Text); - _parametriSetup.AggiornaParametro("MarchioLarghezza", TextBox15.Text); - _parametriSetup.AggiornaParametro("MarchioMargine", TextBox16.Text); - _parametriSetup.AggiornaParametro("MarchioAllOrizzontale", ComboBox4.Text); - _parametriSetup.AggiornaParametro("MarchioAllVerticale", ComboBox5.Text); - _parametriSetup.AggiornaParametro("MarchioTrasparenza", TextBox19.Text); - _parametriSetup.AggiornaParametro("MarchioAggiungi", CheckBox5.Checked); - _parametriSetup.AggiornaParametro("TempoGara", CheckBox7.Checked); - _parametriSetup.AggiornaParametro("Orario", CheckBox8.Checked); - _parametriSetup.AggiornaParametro("EtichettaOrario", TextBox18.Text); - _parametriSetup.AggiornaParametro("GeneraleForzaJpg", chkForzaJpg.Checked); - _parametriSetup.AggiornaParametro("GeneraleRotazioneAutomatica", chkRotazioneAutomatica.Checked); - _parametriSetup.AggiornaParametro("GrandezzaVerticale", TextBox30.Text); - _parametriSetup.AggiornaParametro("MargineVerticale", TextBox31.Text); - _parametriSetup.AggiornaParametro("DimensioniOriginali", CheckBox15.Checked); - _parametriSetup.AggiornaParametro("TestoVerticale", Model.VerticalText); - _parametriSetup.AggiornaParametro("NomeMiniatura", RadioButton6.Checked); - _parametriSetup.AggiornaParametro("DataFoto", CheckBox16.Checked); - _parametriSetup.AggiornaParametro("NumeroFoto", CheckBox17.Checked); - _parametriSetup.AggiornaParametro("ColoreTestoRGB", TextBox34.Text); - _parametriSetup.AggiornaParametro("TempoSmall", RadioButton5.Checked); - _parametriSetup.AggiornaParametro("NumTempoSmall", RadioButton7.Checked); - _parametriSetup.AggiornaParametro("CompressioneJpeg", TextBox32.Text); - _parametriSetup.AggiornaParametro("CompressioneJpegMiniatura", TextBox33.Text); - // 2021 - _parametriSetup.AggiornaParametro("ChunkSize", TextBox8.Text); - _parametriSetup.AggiornaParametro("ThreadsCount", TextBox7.Text); - _parametriSetup.SalvaParametriSetup(); - Text = "Image Catalog - " + LeggiSoloNomeFile(IlNome); + _parametriSetup.AggiornaParametro("DirDividiTipoNumerazione", "Progressiva"); } + else + { + _parametriSetup.AggiornaParametro("DirDividiTipoNumerazione", "Files"); + } + + _parametriSetup.AggiornaParametro("MiniatureCrea", CheckBox1.Checked); + _parametriSetup.AggiornaParametro("MiniatureSuffisso", TextBox3.Text); + _parametriSetup.AggiornaParametro("MiniatureAltezza", TextBox5.Text); + _parametriSetup.AggiornaParametro("MiniatureLarghezza", TextBox6.Text); + _parametriSetup.AggiornaParametro("MiniatureAddScritta", RadioButton3.Checked); + _parametriSetup.AggiornaParametro("MiniatureAddOrario", RadioButton4.Checked); + _parametriSetup.AggiornaParametro("FotoAltezza", TextBox27.Text); + _parametriSetup.AggiornaParametro("FotoLarghezza", TextBox28.Text); + // SetupIni.AggiornaParametro("FotoCodice", TextBox13.Text) + // SetupIni.AggiornaParametro("FotoDimOriginali", CheckBox2.Checked) + + _parametriSetup.AggiornaParametro("FontDimensione", TextBox11.Text); + _parametriSetup.AggiornaParametro("FontDimensioneMiniatura", TextBox25.Text); + _parametriSetup.AggiornaParametro("FontBold", CheckBox3.Checked); + _parametriSetup.AggiornaParametro("FontNome", ComboBox3.Text); + _parametriSetup.AggiornaParametro("TestoTesto", Model.HorizontalText); + _parametriSetup.AggiornaParametro("TestoTrasparente", TextBox9.Text); + _parametriSetup.AggiornaParametro("TestoMargine", TextBox12.Text); + _parametriSetup.AggiornaParametro("TestoPosizione", ComboBox1.Text); + _parametriSetup.AggiornaParametro("TestoAllineamento", ComboBox2.Text); + _parametriSetup.AggiornaParametro("MarchioFile", TextBox10.Text); + _parametriSetup.AggiornaParametro("MarchioAltezza", TextBox14.Text); + _parametriSetup.AggiornaParametro("MarchioLarghezza", TextBox15.Text); + _parametriSetup.AggiornaParametro("MarchioMargine", TextBox16.Text); + _parametriSetup.AggiornaParametro("MarchioAllOrizzontale", ComboBox4.Text); + _parametriSetup.AggiornaParametro("MarchioAllVerticale", ComboBox5.Text); + _parametriSetup.AggiornaParametro("MarchioTrasparenza", TextBox19.Text); + _parametriSetup.AggiornaParametro("MarchioAggiungi", CheckBox5.Checked); + _parametriSetup.AggiornaParametro("TempoGara", CheckBox7.Checked); + _parametriSetup.AggiornaParametro("Orario", CheckBox8.Checked); + _parametriSetup.AggiornaParametro("EtichettaOrario", TextBox18.Text); + _parametriSetup.AggiornaParametro("GeneraleForzaJpg", chkForzaJpg.Checked); + _parametriSetup.AggiornaParametro("GeneraleRotazioneAutomatica", chkRotazioneAutomatica.Checked); + _parametriSetup.AggiornaParametro("GrandezzaVerticale", TextBox30.Text); + _parametriSetup.AggiornaParametro("MargineVerticale", TextBox31.Text); + _parametriSetup.AggiornaParametro("DimensioniOriginali", CheckBox15.Checked); + _parametriSetup.AggiornaParametro("TestoVerticale", Model.VerticalText); + _parametriSetup.AggiornaParametro("NomeMiniatura", RadioButton6.Checked); + _parametriSetup.AggiornaParametro("DataFoto", CheckBox16.Checked); + _parametriSetup.AggiornaParametro("NumeroFoto", CheckBox17.Checked); + _parametriSetup.AggiornaParametro("ColoreTestoRGB", TextBox34.Text); + _parametriSetup.AggiornaParametro("TempoSmall", RadioButton5.Checked); + _parametriSetup.AggiornaParametro("NumTempoSmall", RadioButton7.Checked); + _parametriSetup.AggiornaParametro("CompressioneJpeg", TextBox32.Text); + _parametriSetup.AggiornaParametro("CompressioneJpegMiniatura", TextBox33.Text); + // 2021 + _parametriSetup.AggiornaParametro("ChunkSize", TextBox8.Text); + _parametriSetup.AggiornaParametro("ThreadsCount", TextBox7.Text); + _parametriSetup.AggiornaParametro("OverwriteImages", Model.OverwriteImages); + _parametriSetup.SalvaParametriSetup(); + Text = "Image Catalog - " + LeggiSoloNomeFile(ilNome); } private void Button6_Click(object sender, EventArgs e) @@ -471,6 +471,7 @@ public partial class MainForm TextBox32.Text = _parametriSetup.LeggiParametroString("CompressioneJpeg"); TextBox33.Text = _parametriSetup.LeggiParametroString("CompressioneJpegMiniatura"); TextBox34.Text = _parametriSetup.LeggiParametroString("ColoreTestoRGB"); + Model.OverwriteImages = _parametriSetup.LeggiParametroBoolean("OverwriteImages"); if (File.Exists(TextBox10.Text)) { PictureBox1.Image = Image.FromFile(TextBox10.Text); @@ -572,6 +573,7 @@ public partial class MainForm _picSettings.TestoMin = RadioButton6.Checked; _picSettings.JpegQuality = int.Parse(TextBox32.Text); _picSettings.JpegQualityMin = int.Parse(TextBox33.Text); + _picSettings.OverwriteFiles = Model.OverwriteImages; } private List getFiles(DirectoryInfo sourceDir) diff --git a/imagecatalog/ParametriSetup.cs b/imagecatalog/ParametriSetup.cs index 2fb9290..3558b49 100644 --- a/imagecatalog/ParametriSetup.cs +++ b/imagecatalog/ParametriSetup.cs @@ -57,21 +57,21 @@ namespace ImageCatalog return Risposta; } - public bool LeggiParametroBoolean(string NomeParametro) + public bool LeggiParametroBoolean(string nomeParametro) { - string Risposta = ""; + var risposta = ""; try { - var LElenco = _ElencoParametri.Tables["Setup"].Select("Nome='" + NomeParametro + "'"); - foreach (var LaRiga in LElenco) - Risposta = LaRiga["Valore"].ToString(); + var lElenco = _ElencoParametri.Tables["Setup"].Select("Nome='" + nomeParametro + "'"); + foreach (var laRiga in lElenco) + risposta = laRiga["Valore"].ToString(); } catch { - Risposta = ""; + risposta = ""; } - switch (Risposta.ToUpper() ?? "") + switch (risposta.ToUpper() ?? "") { case "TRUE": case "OK": diff --git a/imagecatalog/Program.cs b/imagecatalog/Program.cs index dad280d..322ecb5 100644 --- a/imagecatalog/Program.cs +++ b/imagecatalog/Program.cs @@ -4,97 +4,138 @@ using ImageCatalog_2.Services; using MaddoShared; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Logging.Console; +using Microsoft.Extensions.Options; -namespace ImageCatalog_2 +namespace ImageCatalog_2; + +static class Program { - static class Program + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool AllocConsole(); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr GetStdHandle(int nStdHandle); + + private const int STD_OUTPUT_HANDLE = -11; + private const int STD_ERROR_HANDLE = -12; + + [DllImport("kernel32.dll", SetLastError = true)] + static extern bool SetStdHandle(int nStdHandle, IntPtr handle); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr GetConsoleWindow(); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern bool AttachConsole(int dwProcessId); + + [DllImport("kernel32.dll", SetLastError = true)] + static extern IntPtr CreateFile( + string lpFileName, + uint dwDesiredAccess, + uint dwShareMode, + IntPtr lpSecurityAttributes, + uint dwCreationDisposition, + uint dwFlagsAndAttributes, + IntPtr hTemplateFile); + + private const uint GENERIC_WRITE = 0x40000000; + private const uint OPEN_EXISTING = 3; + + private static void RedirectConsoleOutput() { - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool AllocConsole(); + var stdOutHandle = CreateFile("CONOUT$", GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); + var safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdOutHandle, true); + var fileStream = new FileStream(safeFileHandle, FileAccess.Write); + var standardOutput = new StreamWriter(fileStream) { AutoFlush = true }; + Console.SetOut(standardOutput); + Console.SetError(standardOutput); + } - [DllImport("kernel32.dll", SetLastError = true)] - static extern IntPtr GetStdHandle(int nStdHandle); + public static IServiceProvider ServiceProvider { get; private set; } + [STAThread] + static void Main() + { + Application.SetHighDpiMode(HighDpiMode.SystemAware); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); - private const int STD_OUTPUT_HANDLE = -11; - private const int STD_ERROR_HANDLE = -12; - - [DllImport("kernel32.dll", SetLastError = true)] - static extern bool SetStdHandle(int nStdHandle, IntPtr handle); - - [DllImport("kernel32.dll", SetLastError = true)] - static extern IntPtr GetConsoleWindow(); - - [DllImport("kernel32.dll", SetLastError = true)] - static extern bool AttachConsole(int dwProcessId); - - [DllImport("kernel32.dll", SetLastError = true)] - static extern IntPtr CreateFile( - string lpFileName, - uint dwDesiredAccess, - uint dwShareMode, - IntPtr lpSecurityAttributes, - uint dwCreationDisposition, - uint dwFlagsAndAttributes, - IntPtr hTemplateFile); - - private const uint GENERIC_WRITE = 0x40000000; - private const uint OPEN_EXISTING = 3; - - private static void RedirectConsoleOutput() - { - var stdOutHandle = CreateFile("CONOUT$", GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); - var safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdOutHandle, true); - var fileStream = new FileStream(safeFileHandle, FileAccess.Write); - var standardOutput = new StreamWriter(fileStream) { AutoFlush = true }; - Console.SetOut(standardOutput); - Console.SetError(standardOutput); - } - - public static IServiceProvider ServiceProvider { get; private set; } - [STAThread] - static void Main() - { - Application.SetHighDpiMode(HighDpiMode.SystemAware); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - - AllocConsole(); - RedirectConsoleOutput(); + AllocConsole(); + RedirectConsoleOutput(); - var serviceCollection = new ServiceCollection(); - ConfigureServices(serviceCollection); + var serviceCollection = new ServiceCollection(); + ConfigureServices(serviceCollection); - ServiceProvider = serviceCollection.BuildServiceProvider(); + ServiceProvider = serviceCollection.BuildServiceProvider(); - var mainForm = ServiceProvider.GetRequiredService(); - //var mainViewModel = ServiceProvider.GetRequiredService(); + var mainForm = ServiceProvider.GetRequiredService(); + //var mainViewModel = ServiceProvider.GetRequiredService(); - //mainForm.Model = mainViewModel; + //mainForm.Model = mainViewModel; - Application.Run(mainForm); - } + Application.Run(mainForm); + } - private static void ConfigureServices(ServiceCollection services) - { - // Register your services here - services.AddTransient(); + private static void ConfigureServices(ServiceCollection services) + { + // Register your services here + services.AddTransient(); - services.AddTransient(); + services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); - // Register your forms - services.AddTransient(); + // Register your forms + services.AddTransient(); - services.AddLogging(configure => - { - configure.AddConsole(); - configure.SetMinimumLevel(LogLevel.Debug); - }); - } + services.AddLogging(configure => + { + configure.AddCustomFormatter(); + configure.AddConsole(); + configure.SetMinimumLevel(LogLevel.Debug); + }); } } + +public static class ConsoleLoggerExtensions +{ + public static ILoggingBuilder AddCustomFormatter( + this ILoggingBuilder builder) => + builder.AddConsole(options => options.FormatterName = nameof(CustomLoggingFormatter)) + .AddConsoleFormatter(); +} +public sealed class CustomLoggingFormatter : ConsoleFormatter, IDisposable +{ + private readonly IDisposable _optionsReloadToken; + private ConsoleFormatterOptions _formatterOptions; + public CustomLoggingFormatter(IOptionsMonitor options) + // Case insensitive + : base(nameof(CustomLoggingFormatter)) => + (_optionsReloadToken, _formatterOptions) = + (options.OnChange(ReloadLoggerOptions), options.CurrentValue); + private void ReloadLoggerOptions(ConsoleFormatterOptions options) => + _formatterOptions = options; + + public override void Write( + in LogEntry logEntry, + IExternalScopeProvider scopeProvider, + TextWriter textWriter) + { + string? message = + logEntry.Formatter?.Invoke( + logEntry.State, logEntry.Exception); + + if (message is null) + { + return; + } + + textWriter.WriteLine($"{message}"); + } + public void Dispose() => _optionsReloadToken?.Dispose(); +} \ No newline at end of file