Example #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);
        }
Example #2
0
        public async Task ExtractAsync(string inputPath, string outputPath)
        {
            await using var stream = ArchiveStream.OpenRead(inputPath);

            var directoryHeaders = (await stream.ReadAllDirectoriesAsync(outputPath)).ToList();
            var fileHeaders      = (await stream.ReadAllFileHeadersAsync(outputPath)).ToList();

            directoryHeaders.AsParallel().ForAll(x =>
            {
                if (!string.IsNullOrEmpty(x.FullPath) && !Directory.Exists(x.FullPath))
                {
                    Directory.CreateDirectory(x.FullPath);
                }
            });

            try
            {
                await Decompressor.DecompressAsync(stream, fileHeaders);
            }
            catch (Exception ex)
            {
                await DeleteFiles(fileHeaders);
                await DeleteDirectories(directoryHeaders);

                throw new ArchiveException(ex.Message);
            }
        }
Example #3
0
        public async Task <List <FileHeader> > GetFilesAsync(string path)
        {
            await using var stream = ArchiveStream.OpenRead(path);

            var fileHeaders = await stream.ReadAllFileHeadersAsync(path);

            return(fileHeaders.ToList());
        }
Example #4
0
        public async Task <bool> IsEncryptedAsync(string path)
        {
            await using var stream = ArchiveStream.OpenRead(path);

            var archiveInfo = await stream.ReadArchiveInfoAsync();

            return(archiveInfo.IsEncrypted);
        }
Example #5
0
        public async Task <ArchiveInfo> GetArchiveInfoAsync(string path)
        {
            await using var stream = ArchiveStream.OpenRead(path);

            var archiveInfo = await stream.ReadArchiveInfoAsync();

            return(archiveInfo);
        }
Example #6
0
        public async Task <List <DirectoryHeader> > GetDirectoriesAsync(string path)
        {
            await using var stream = ArchiveStream.OpenRead(path);

            var directoryHeaders = await stream.ReadAllDirectoriesAsync(path);

            return(directoryHeaders.ToList());
        }
Example #7
0
        public async Task <bool> IsArchiveAsync(string path)
        {
            await using var stream = ArchiveStream.OpenRead(path);

            try
            {
                await stream.ReadArchiveInfoAsync();

                return(true);
            }
            catch
            {
                return(false);
            }
        }
Example #8
0
        private async Task CompressBigFileAsync(FileHeader header)
        {
            await using var readStream = ArchiveStream.OpenRead(header.FullPath, Settings.ThreadsCount);
            var chunkCompressor = GetChunkCompressor();

            header.NumberOfChunks = readStream.GetChunksCount();
            _outputStream.Seek(header.SizeOf, SeekOrigin.Current);

            header.Position = _outputStream.Position;
            var chunkSerialNumber = 0;

            await foreach (var chunks in readStream.ReadFileInChunksAsync(Settings.ChunkSize))
            {
                var tasks            = chunks.Select(x => chunkCompressor(x, header.CompressionType));
                var chunksSizes      = chunks.Select(x => x.Length).ToArray();
                var compressedChunks = await Task.WhenAll(tasks);

                for (var i = 0; i < compressedChunks.Length; i++)
                {
                    var chunkHeader = new ChunkHeader()
                    {
                        Size         = compressedChunks[i].Length,
                        SerialNumber = chunkSerialNumber++,
                    };

                    header.Chunks.Add(chunkHeader);
                    await _outputStream.WriteAsync(compressedChunks[i]);

                    _archiveProgress.Report(header.RelativePath, chunksSizes[i], chunkHeader.SerialNumber,
                                            header.NumberOfChunks);
                }

                var currentPosition = _outputStream.Position;
                _outputStream.Position = header.Position - header.SizeOf;

                await _outputStream.WriteFileHeaderAsync(header);

                _outputStream.Position = currentPosition;
            }
        }