private void DownloadInjureFile(int index = 0) { if (index >= PreferenceFiles.Count) { ///Tracking change to download status PreferenceTracker.DownloadEngineStatusArgs.DownloadStatus = DownloadStatusFlags.Finished; PreferenceTracker.DownloadEngineStatusChange(PreferenceTracker.DownloadEngineStatusArgs); return; } ///Tracking change to downloading file PreferenceTracker.DownloadEngineFileArgs.Name = PreferenceFiles[index].Name; PreferenceTracker.DownloadEngineFileArgs.Directory = PreferenceFiles[index].Directory; PreferenceTracker.DownloadEngineFileChange(PreferenceTracker.DownloadEngineFileArgs); WebClient client = new WebClient(); long LastBytesReceived = 0; client.DownloadFileCompleted += (s, e) => DownloadInjureFile(++index); client.DownloadProgressChanged += (s, e) => { TotalBytesConfirmed += (e.BytesReceived - LastBytesReceived); LastBytesReceived = e.BytesReceived; int Percentage = Convert.ToInt32((double)TotalBytesConfirmed / (double)TotalBytes * 100.0); ///Tracking change to downloading progress PreferenceTracker.DownloadEngineProgressArgs.Size = PreferenceFiles[index].Size; PreferenceTracker.DownloadEngineProgressArgs.DownloadedSize = e.BytesReceived; PreferenceTracker.DownloadEngineProgressArgs.Percentage = Percentage; PreferenceTracker.DownloadEngineProgressChange(PreferenceTracker.DownloadEngineProgressArgs); }; client.DownloadFileAsync(PreferenceFiles[index].Address, Path.Combine(SaveDirectory, PreferenceFiles[index].Directory, PreferenceFiles[index].Name)); }
/// <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); }