/// <summary> /// Files preference manager allows you to check the integrity of files, download missing or injured ones, as well as delete unnecessary ones and track all this /// </summary> /// <param name="SaveDirectory">Root path for downloading and checking files</param> /// <param name="AddressToFiles">URL address to json file</param> /// <param name="ValidityMode">File check mode</param> /// <param name="PreferenceTracker"></param> public FilesPreferenceManager(string SaveDirectory, Uri AddressToFiles, FileValidityMode ValidityMode, PreferenceTrackingHandler PreferenceTracker) { this.SaveDirectory = SaveDirectory; this.AddressToFiles = AddressToFiles; this.ValidityMode = ValidityMode; this.PreferenceTracker = PreferenceTracker; Directory.CreateDirectory(SaveDirectory); }
static void Main(string[] args) { // The path to the folder for downloading and checking files. string SavePath = @"C:\Sample folder"; // Link to json file, it is generated using PreferenceGenerator.php Uri AddressToJson = new Uri("http://test1.ru/PreferenceFiles.json"); // There are two modes for checking files. (Hashing/Sizing) // The first is more accurate, but the second is much faster. FileValidityMode ValidityMode = FileValidityMode.Hashing; //or FileValidityMode.Sizing; PreferenceTrackingHandler PreferenceTracker = new PreferenceTrackingHandler(); PreferenceTracker.DownloadEngineStatusChanged += (s, e) => // When the download state changes. { Console.WriteLine(string.Format($"Status: {e.DownloadStatus}")); }; PreferenceTracker.DownloadEngineFileChanged += (s, e) => // When the next file starts downloading. { Console.WriteLine(string.Format($"Download now: {Path.Combine(e.Directory, e.Name)}")); }; PreferenceTracker.DownloadEngineProgressChanged += (s, e) => // When new bytes are received. { Console.WriteLine(string.Format($"Downloaded: {e.DownloadedSize} / {e.Size} | Percentage: {e.Percentage}")); }; // Declaring the main instance of the manager class and initializing the download engine. FilesPreferenceManager PreferenceManager = new FilesPreferenceManager(SavePath, AddressToJson, ValidityMode, PreferenceTracker); PreferenceManager.InitializeDownloadEngine(); Console.ReadKey(); }
/// <summary> /// This method allows you to check the integrity of the files, the list of which it received /// </summary> /// <param name="SaveDirectory">File check root path</param> /// <param name="PreferenceFiles">List of preference files</param> /// <param name="ValidityMode">File check mode</param> /// <returns>List of files edited as a result of the method</returns> public List <PreferenceFile> ValidateFiles(string SaveDirectory, List <PreferenceFile> PreferenceFiles, FileValidityMode ValidityMode, ref PreferenceTrackingHandler PreferenceTracker) { ///Tracking change to download status PreferenceTracker.DownloadEngineStatusArgs.DownloadStatus = DownloadStatusFlags.Validating; PreferenceTracker.DownloadEngineStatusChange(PreferenceTracker.DownloadEngineStatusArgs); List <PreferenceFile> PreferenceInjuredFiles = new List <PreferenceFile>(); foreach (PreferenceFile ValidityFile in PreferenceFiles) { if (!string.IsNullOrEmpty(ValidityFile.Directory)) { Directory.CreateDirectory(Path.Combine(SaveDirectory, ValidityFile.Directory)); } if (!File.Exists(Path.Combine(SaveDirectory, ValidityFile.Directory, ValidityFile.Name))) { PreferenceInjuredFiles.Add(ValidityFile); continue; } if (ValidityMode == FileValidityMode.Sizing) { if (new FileInfo(Path.Combine(SaveDirectory, ValidityFile.Directory, ValidityFile.Name)).Length != ValidityFile.Size) { PreferenceInjuredFiles.Add(ValidityFile); } } else if (ValidityMode == FileValidityMode.Hashing) { MD5 Crypto = MD5.Create(); FileStream Stream = File.OpenRead(Path.Combine(SaveDirectory, ValidityFile.Directory, ValidityFile.Name)); byte[] Hashcode = Crypto.ComputeHash(Stream); string Hash = (BitConverter.ToString(Hashcode).Replace("-", string.Empty)).ToLower(); if (Hash != ValidityFile.Hash) { PreferenceInjuredFiles.Add(ValidityFile); } } } return(PreferenceInjuredFiles); }