示例#1
0
        public void TestCancel()
        {
            var compression = new Compression();

            var almostEndlessStream = new AlmostEndlessStreamMock();
            using (var dst = new MemoryStream())
            {
                var thread = new Thread(() =>
                {
                    Thread.Sleep(TimeSpan.FromSeconds(0.1));
                    compression.Cancel();
                });
                thread.Start();

                compression.CompressAsaiwa(almostEndlessStream, dst);
            }
        }
示例#2
0
        private static int Main(string[] args)
        {
            CompressionMode mode;
            string srcFileName;
            string dstFileName;
            if (!ValidateStartupAgrs(args, out mode, out srcFileName, out dstFileName))
            {
                Console.WriteLine("The syntax of the command params is incorrect. Showld be: (compress|decompress) Source Destination" );
                return ErrorAppExitCode;
            }

            var compression = new Compression();
            compression.ProgressChanged += (_,__) => Console.Write("░");

            Console.CancelKeyPress += (sender, e) =>
            {
                e.Cancel = true;
                compression.Cancel();
                Console.WriteLine("\nCancelling...");
            };

            try
            {
                using (var srcFile = new FileStream(srcFileName, FileMode.Open, FileAccess.Read))
                {
                    using (var dstFile = new FileStream(dstFileName, FileMode.Create, FileAccess.Write))
                    {
                        switch (mode)
                        {
                            case CompressionMode.Compress:
                                compression.CompressAsaiwa(srcFile, dstFile);
                                //compression.Compress(srcFile, dstFile);
                                break;
                            case CompressionMode.Decompress:
                                compression.DecompressAsaiwa(srcFile, dstFile);
                                //compression.Decompress(srcFile, dstFile);
                                break;
                        }
                    }
                }

                Console.WriteLine();
                Console.WriteLine("Done: "+ dstFileName);
            }
            catch (Exception e)
            {
                File.Delete(dstFileName);
                // Не уверен, хорошая это идея или нет.
                // Вероятно, правильный вариант -- складывать результат во временный файл рядом,
                // а после удачного выполнения заменять уже существующий файл с таким имененем (если он есть) свежесозданным.
                // В случае неудачи старый файл окажется целым.

                if (!(e is OperationCanceledException))
                {
                    var errorLogFile = WriteErrorLog(e, dstFileName);
                    Console.WriteLine(e.Message + Environment.NewLine + "For details please see " + errorLogFile);
                    // в это место на диске можно писать (если запрет не стал причиной экспешена) и, наверное,
                    // пользователь именно там будет искать результат, и найдет описание причины неудачи
                }

                return ErrorAppExitCode;
            }

            return SuccessAppExitCode;
        }