예제 #1
0
        public async void Case5()
        {
            var origF   = SampleFinder.Get("sample_4.6mb");
            var oldHash = origF.SHA1ForFile();
            var outDir  = TempDir.New();

            var archives = await SevenZipper1.Compress(origF, outDir, 0.5);

            archives.MustHaveFiles(7);

            var list = await SevenZipper1.DecompressMultiPart(archives, outDir);

            foreach (var part in archives)
            {
                File.Exists(part).Should().BeFalse("Should delete parts after merge");
            }

            list.Should().HaveCount(1);

            var newF    = Path.Combine(outDir, list[0]);
            var newHash = newF.SHA1ForFile();

            newHash.Should().Be(oldHash, "Hashes should match");

            Directory.GetFiles(outDir).Length.Should().Be(2, "Should delete OneBigF");

            Directory.Delete(outDir, true);
        }
예제 #2
0
        public async Task <string> DownloadAndExtract(List <R1SplitPart> splitParts, string expectedHash)
        {
            var orderedParts = splitParts.OrderBy(x => x.PartNumber).ToList();

            _lastTempDir = CreateTempFolder();
            for (int i = 0; i < orderedParts.Count; i++)
            {
                Status = $"Downloading part {i + 1} of {orderedParts.Count}";
                var part = orderedParts[i];
                var path = Path.Combine(_lastTempDir, part.FileName);

                var byts = await GetPartContentByHash(part.PartHash);

                if (byts == null)
                {
                    return(null);
                }

                File.WriteAllBytes(path, byts);
                if (path.SHA1ForFile() != part.PartHash)
                {
                    Warn("Expected PartHash did not match actual hash.");
                    return(null);
                }

                part.FullPathOrURL = path;
            }

            Status = "Merging and decompressing downloaded file ...";
            var           paths = orderedParts.Select(x => x.FullPathOrURL);
            List <string> list  = null;

            try
            {
                list = await SevenZipper1.DecompressMultiPart(paths, _lastTempDir);
            }
            catch (Exception ex)
            {
                Warn("[Decompress Error] Downloaded file may be corrupted." + L.f + ex.Info());
                return(null);
            }
            if (list == null)
            {
                Warn("[Decompress Fail] Downloaded file may be corrupted.");
                return(null);
            }

            var exePath = Path.Combine(_lastTempDir, list[0]);

            if (exePath.SHA1ForFile() == expectedHash)
            {
                return(exePath);
            }
            else
            {
                Warn("[Hash Mismatch] Downloaded file may be corrupted.");
                return(null);
            }
        }