예제 #1
0
        private async Task CompressSmallFile(FileHeader header)
        {
            header.NumberOfChunks      = 1;
            await using var readStream = ArchiveStream.OpenRead(header.FullPath);
            var chunkCompressor = GetChunkCompressor();
            var chunk           = await readStream.ReadBytesAsync(header.FileSize);

            var compressedChunk = await chunkCompressor(chunk, header.CompressionType);

            var chunkHeader = new ChunkHeader()
            {
                Size         = compressedChunk.Length,
                SerialNumber = 0
            };

            header.Chunks.Add(chunkHeader);

            using (await _asyncLock.LockAsync())
            {
                header.Position = _outputStream.Position + header.SizeOf;
                await _outputStream.WriteFileHeaderAsync(header);

                await _outputStream.WriteAsync(compressedChunk);
            }

            _archiveProgress.Report(header.RelativePath, chunk.Length, chunkHeader.SerialNumber, header.NumberOfChunks);
        }
예제 #2
0
        private async Task DecompressFileAsync(FileHeader fileHeader)
        {
            await using var outputStream = ArchiveStream.Create(fileHeader.FullPath);
            var chunkDecompressor = GetChunkDecompressor(fileHeader.IsEncrypted);

            foreach (var chunk in fileHeader.Chunks)
            {
                byte[] compressChunk;

                using (await _asyncLock.LockAsync())
                {
                    _inputStream.Position = fileHeader.Position;
                    compressChunk         = await _inputStream.ReadBytesAsync(chunk.Size);
                }

                fileHeader.Position += chunk.Size;

                try
                {
                    await chunkDecompressor(compressChunk, outputStream, fileHeader.CompressionType);
                }
                catch
                {
                    if (fileHeader.IsEncrypted)
                    {
                        throw new ArchiveException(ExceptionResource.InvalidEncryptKey);
                    }
                    throw new ArchiveException(ExceptionResource.ThisFileIsCorrupted);
                }

                _archiveProgress.Report(fileHeader.RelativePath, chunk.Size, chunk.SerialNumber, fileHeader.NumberOfChunks);
            }
        }