Beispiel #1
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);
            }
        }
Beispiel #2
0
        private static int Decompress(DecompressSubOptions options)
        {
            int           resultCode   = 0;
            IDecompressor decompressor = new Decompressor();

            if (options.MinThreadsCount.HasValue)
            {
                decompressor.Settings.MinWorkersCount = options.MinThreadsCount.Value;
            }
            if (options.MaxThreadsCount.HasValue)
            {
                decompressor.Settings.MaxWorkersCount = options.MaxThreadsCount.Value;
            }
            if (options.AvailableMemorySize.HasValue)
            {
                decompressor.Settings.AvailableMemorySize = options.AvailableMemorySize.Value;
            }
            if (options.ChunkSize.HasValue)
            {
                decompressor.Settings.Reader.Settings.ChunkSize = options.ChunkSize.Value;
            }
            if (options.DecompressionFactor.HasValue)
            {
                decompressor.Settings.DecompressionFactor = options.DecompressionFactor.Value;
            }
            if (options.MemoryLoadThreshold.HasValue)
            {
                decompressor.Settings.MemoryLoadThreshold = options.MemoryLoadThreshold.Value;
            }

            Exception error     = null;
            bool      completed = false;
            bool      canceled  = false;
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

            Console.CancelKeyPress +=
                (sender, args) =>
            {
                cancellationTokenSource.Cancel();

                completed   = true;
                canceled    = true;
                args.Cancel = true;
            };

            Console.WriteLine("Decompression has started. Press CTRL+C to interupt...");

            try
            {
                decompressor.DecompressAsync(
                    options.InputFile,
                    options.OutputFile,
                    (args) =>
                {
                    completed = true;
                    canceled  = args.Cancelled;
                    error     = args.Error;
                },
                    cancellationTokenSource.Token
                    );

                while (!completed)
                {
                    Thread.Sleep(500);
                }

                if (error != null)
                {
                    PrintError(error);
                    resultCode = 1;
                }
                else if (canceled)
                {
                    Console.WriteLine("Decompression has been interrupted");
                }
                else
                {
                    Console.WriteLine("The file has been successfully decompressed");
                }
            }
            catch (Exception exception)
            {
                PrintError(exception);
            }

            return(resultCode);
        }