private void CompressRepairItemsToDestination() { Stopwatch timer = Stopwatch.StartNew(); for (int i = 0; i < patch.Files.Count; i++) { if (cancel) { return; } VersionItem patchItem = patch.Files[i]; string fromAbsolutePath = rootPath + patchItem.Path; string toAbsolutePath = repairPatchOutputPath + patchItem.Path + PatchParameters.COMPRESSED_FILE_EXTENSION; Log(Localization.Get(StringId.CompressingXToY, fromAbsolutePath, toAbsolutePath)); timer.Reset(); timer.Start(); ZipUtils.CompressFileLZMA(fromAbsolutePath, toAbsolutePath); Log(Localization.Get(StringId.CompressionFinishedInXSeconds, timer.ElapsedSeconds())); patchItem.OnCompressed(new FileInfo(toAbsolutePath)); } }
private PatchResult CreateRepairPatch() { if (cancel) { return(PatchResult.Failed); } Directory.CreateDirectory(repairPatchOutputPath); Log(Localization.Get(StringId.CreatingRepairPatch)); Stopwatch timer = Stopwatch.StartNew(); // Compress repair patch files and move them to the destination Log(Localization.Get(StringId.CompressingFilesToDestination)); Stopwatch compressTimer = Stopwatch.StartNew(); for (int i = 0; i < versionInfo.Files.Count; i++) { if (cancel) { return(PatchResult.Failed); } VersionItem patchItem = versionInfo.Files[i]; string fromAbsolutePath = rootPath + patchItem.Path; string toAbsolutePath = repairPatchOutputPath + patchItem.Path + PatchParameters.REPAIR_PATCH_FILE_EXTENSION; Log(Localization.Get(StringId.CompressingXToY, fromAbsolutePath, toAbsolutePath)); compressTimer.Reset(); compressTimer.Start(); ZipUtils.CompressFile(fromAbsolutePath, toAbsolutePath, compressionFormatRepairPatch); Log(Localization.Get(StringId.CompressionFinishedInXSeconds, compressTimer.ElapsedSeconds())); patchItem.OnCompressed(new FileInfo(toAbsolutePath)); } if (cancel) { return(PatchResult.Failed); } Log(Localization.Get(StringId.PatchCreatedInXSeconds, timer.ElapsedSeconds())); // Calculate compression ratio long uncompressedTotal = 0L, compressedTotal = 0L; for (int i = 0; i < versionInfo.Files.Count; i++) { uncompressedTotal += versionInfo.Files[i].FileSize; compressedTotal += versionInfo.Files[i].CompressedFileSize; } Log(Localization.Get(StringId.CompressionRatioIsX, ((double)compressedTotal * 100 / uncompressedTotal).ToString("F2"))); return(PatchResult.Success); }
private PatchResult CreateRepairPatch() { if (cancel) { return(PatchResult.Failed); } Directory.CreateDirectory(repairPatchOutputPath); Log(Localization.Get(StringId.CreatingRepairPatch)); Stopwatch timer = Stopwatch.StartNew(); // Compress repair patch files and move them to the destination Log(Localization.Get(StringId.CompressingFilesToDestination)); Stopwatch compressTimer = Stopwatch.StartNew(); // Check if we can use existing repair patch files for files that didn't change since the last patch string previousRepairPatchFilesRoot = null; if (previousVersionInfo != null && previousVersionInfo.CompressionFormat == compressionFormatRepairPatch) { previousRepairPatchFilesRoot = previousPatchFilesRoot + PatchParameters.REPAIR_PATCH_DIRECTORY + Path.DirectorySeparatorChar; if (!Directory.Exists(previousRepairPatchFilesRoot)) { previousRepairPatchFilesRoot = null; } } for (int i = 0; i < versionInfo.Files.Count; i++) { if (cancel) { return(PatchResult.Failed); } VersionItem patchItem = versionInfo.Files[i]; string fromAbsolutePath = rootPath + patchItem.Path; string toAbsolutePath = repairPatchOutputPath + patchItem.Path + PatchParameters.REPAIR_PATCH_FILE_EXTENSION; if (previousRepairPatchFilesRoot != null) { VersionItem previousPatchItem = previousVersionInfo.Files.Find((item) => item.Path == patchItem.Path); if (previousPatchItem != null && previousPatchItem.FileSize == patchItem.FileSize && previousPatchItem.Md5Hash == patchItem.Md5Hash) { if (dontCreatePatchFilesForUnchangedFiles) { patchItem.CompressedFileSize = previousPatchItem.CompressedFileSize; patchItem.CompressedMd5Hash = previousPatchItem.CompressedMd5Hash; continue; } FileInfo previousCompressedFile = new FileInfo(previousRepairPatchFilesRoot + patchItem.Path + PatchParameters.REPAIR_PATCH_FILE_EXTENSION); if (previousCompressedFile.Exists && previousCompressedFile.MatchesSignature(previousPatchItem.CompressedFileSize, previousPatchItem.CompressedMd5Hash)) { Log(Localization.Get(StringId.CopyingXToPatch, previousCompressedFile.FullName)); PatchUtils.CopyFile(previousCompressedFile.FullName, toAbsolutePath); patchItem.CompressedFileSize = previousPatchItem.CompressedFileSize; patchItem.CompressedMd5Hash = previousPatchItem.CompressedMd5Hash; continue; } } } Log(Localization.Get(StringId.CompressingXToY, fromAbsolutePath, toAbsolutePath)); compressTimer.Reset(); compressTimer.Start(); ZipUtils.CompressFile(fromAbsolutePath, toAbsolutePath, compressionFormatRepairPatch); Log(Localization.Get(StringId.CompressionFinishedInXSeconds, compressTimer.ElapsedSeconds())); patchItem.OnCompressed(new FileInfo(toAbsolutePath)); } if (cancel) { return(PatchResult.Failed); } Log(Localization.Get(StringId.PatchCreatedInXSeconds, timer.ElapsedSeconds())); // Calculate compression ratio long uncompressedTotal = 0L, compressedTotal = 0L; for (int i = 0; i < versionInfo.Files.Count; i++) { uncompressedTotal += versionInfo.Files[i].FileSize; compressedTotal += versionInfo.Files[i].CompressedFileSize; } Log(Localization.Get(StringId.CompressionRatioIsX, ((double)compressedTotal * 100 / uncompressedTotal).ToString("F2"))); return(PatchResult.Success); }