using File_Watcher.Models; using Microsoft.Extensions.Hosting.WindowsServices; namespace File_Watcher; public partial class Worker : BackgroundService { private readonly bool _IsWindowsService; private readonly ILogger _Logger; private readonly AppSettings _AppSettings; public Worker(IServiceProvider serviceProvider, ILogger logger, AppSettings appSettings, List collection) { _Logger = logger; _AppSettings = appSettings; logger.LogInformation("{buildNumber}-{gitCommitSeven}", _AppSettings.BuildNumber, _AppSettings.GitCommitSeven); try { logger.LogInformation("<{folder}>", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); } catch (Exception) { } _IsWindowsService = collection.Contains(nameof(WindowsServiceLifetime)); } private void Body() { _Logger.LogInformation("A) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt")); if (!Directory.Exists(_AppSettings.WatchDirectory)) _ = Directory.CreateDirectory(_AppSettings.WatchDirectory); if (!Directory.Exists(Path.GetPathRoot(_AppSettings.Destination)) || !Directory.Exists(_AppSettings.Destination)) _Logger.LogCritical("<{Destination}> Doesn't exist!", _AppSettings.Destination); else { string[] files; string checkFile; FileInfo fileInfo; string checkDirectory; string[] directories = Directory.GetDirectories(_AppSettings.WatchDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string directory in directories) { checkDirectory = Path.Combine(_AppSettings.Destination, Path.GetFileName(directory)); try { if (!Directory.Exists(checkDirectory)) _ = Directory.CreateDirectory(checkDirectory); files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); foreach (string file in files) { fileInfo = new(file); if (new TimeSpan(DateTime.Now.Ticks - fileInfo.LastWriteTime.Ticks).TotalMilliseconds < _AppSettings.MillisecondsDelay) continue; checkFile = Path.Combine(checkDirectory, Path.GetFileName(file)); if (File.Exists(checkFile)) continue; try { File.Move(file, checkFile); } catch (Exception ex) { _Logger.LogError(ex, "Inner loop error!"); } } } catch (Exception ex) { _Logger.LogError(ex, "Loop error!"); } } } _Logger.LogInformation("B) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt")); } private async Task Body(CancellationToken stoppingToken) { while (_IsWindowsService && !stoppingToken.IsCancellationRequested) { Body(); await Task.Delay(_AppSettings.MillisecondsDelay, stoppingToken); } } protected override async Task ExecuteAsync(CancellationToken stoppingToken) => await Body(stoppingToken); }