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); }
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); } }