private static ReadOnlyCollection <FileInfo> SelectFilesToArchive(ArchivizerConfiguration configuration)
        {
            var result = new List <FileInfo>();

            foreach (var configurationForDirectory in configuration.ArchivizerConfigurationsForDirectory.Values)
            {
                var files = Directory.GetFiles(configurationForDirectory.DirectoryFullName);

                var archiveFiles = new HashSet <FileInfo>();
                var sourceFiles  = new HashSet <FileInfo>();

                foreach (var file in files)
                {
                    var fileInfo = new FileInfo(file);
                    if (fileInfo.Extension == $".{configurationForDirectory.FormatArchiwum}")
                    {
                        archiveFiles.Add(fileInfo);
                    }
                    else if (fileInfo.Extension == $".{configurationForDirectory.FileExtensionToCompression}")
                    {
                        sourceFiles.Add(fileInfo);
                    }
                }

                var fileToArchive = sourceFiles.Except(archiveFiles, new FileInfoComparer()).ToList();
                result.AddRange(fileToArchive);
            }
            return(new ReadOnlyCollection <FileInfo>(result));
        }
 private static void DeleteSourceFile(ArchivizerConfiguration configuration, FileInfo fileInfo)
 {
     if (configuration.DeleteSourceFileAfterArchiving)
     {
         File.Delete(fileInfo.FullName);
     }
 }
        private static ReadOnlyCollection <FileInfo> SelectArchiveToDelete(ArchivizerConfiguration configuration)
        {
            var archiveToDelete = new List <FileInfo>();

            if (!configuration.MaxNumberOfLatestArchiveFilesInKept.HasValue)
            {
                return(new ReadOnlyCollection <FileInfo>(archiveToDelete));
            }

            foreach (var configurationForDirectory in configuration.ArchivizerConfigurationsForDirectory.Values)
            {
                var subResult = new SortedDictionary <DateTime, List <FileInfo> >();
                var files     = Directory.GetFiles(configurationForDirectory.DirectoryFullName);

                foreach (var file in files)
                {
                    var fileInfo = new FileInfo(file);
                    if (fileInfo.Extension == $".{configurationForDirectory.FormatArchiwum}")
                    {
                        var match = Regex.Match(fileInfo.Name, @"\d{4}_\d{2}_\d{2}");
                        if (match.Success)
                        {
                            var archiveCreateDate = DateTime.ParseExact(match.Value, @"yyyy_MM_dd",
                                                                        new System.Globalization.CultureInfo("pl-PL"));

                            if (subResult.ContainsKey(archiveCreateDate))
                            {
                                subResult[archiveCreateDate].Add(fileInfo);
                            }
                            else
                            {
                                subResult.Add(archiveCreateDate, new List <FileInfo> {
                                    fileInfo
                                });
                            }
                        }
                    }
                }

                var i = 1;
                foreach (var item in subResult.Reverse())
                {
                    if (i > configuration.MaxNumberOfLatestArchiveFilesInKept.Value)
                    {
                        archiveToDelete.AddRange(item.Value);
                    }
                    i++;
                }
            }
            return(new ReadOnlyCollection <FileInfo>(archiveToDelete));
        }
 private void ValidateConfiguration(ArchivizerConfiguration configuration)
 {
     if (!File.Exists(configuration.Achivizer7zFullName))
     {
         throw new ConfigurationErrorsException("Configuration is incorrect. Archiver not found in the indicated path");
     }
     foreach (var item in configuration.ArchivizerConfigurationsForDirectory.Values)
     {
         if (!Directory.Exists(item.DirectoryFullName))
         {
             throw new ConfigurationErrorsException($"Configuration is incorrect. Directory {item.DirectoryFullName} not exist");
         }
     }
 }
        private static void ArchiveFile(ArchivizerConfiguration configuration, FileInfo fileInfo)
        {
            var configurationForDirectory = configuration.ArchivizerConfigurationsForDirectory[fileInfo.DirectoryName];
            var targetName = Path.Combine(fileInfo.DirectoryName, Path.GetFileNameWithoutExtension(fileInfo.FullName) + $".{configurationForDirectory.FormatArchiwum}");

            var p = new ProcessStartInfo()
            {
                FileName = configuration.Achivizer7zFullName, WindowStyle = ProcessWindowStyle.Hidden
            };

            p.Arguments = $"a -t{configurationForDirectory.FormatArchiwum} \"" + targetName + "\" \"" + fileInfo.FullName + $"\" -mx={(int)configurationForDirectory.CompressionLevel}";

            Process x = Process.Start(p);

            x.WaitForExit();
        }
        public ArchivizerConfiguration ReadConfiguration()
        {
            ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap()
            {
                ExeConfigFilename = "ArchivizerConfiguration.config"
            };
            var config = SystemConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

            var globalConfiguration = config.GetSection("GlobalConfigurationSection") as GlobalConfigurationSection;
            var supportedDirectory  = config.GetSection("SupportedArchivizerConfigurationForDirectorySection") as SupportedArchivizerConfigurationForDirectorySection;

            var configurations = supportedDirectory.GetConfiguration();

            var configuration = new ArchivizerConfiguration
            {
                Achivizer7zFullName                  = globalConfiguration.Archivizer7zFullName,
                DeleteSourceFileAfterArchiving       = globalConfiguration.DeleteSourceFileAfterArchiving,
                ArchivizerConfigurationsForDirectory = new ReadOnlyDictionary <string, ArchivizerConfigurationForDirectory>(configurations),
                MaxNumberOfLatestArchiveFilesInKept  = globalConfiguration.MaxNumberOfLatestArchiveFilesInKept
            };

            ValidateConfiguration(configuration);
            return(configuration);
        }