Example #1
0
        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);
        }