예제 #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
        static void Main(string[] args)
        {
            if (args.Length < 2)
            {
                Display.ShowMessage("Not All Parameters are Specified!");
            }

            string Mode = "compress";

            if (args[0].ToLower().Equals("decompress"))
            {
                Mode = "decompress";
            }
            else if (!args[0].ToLower().Equals("compress"))
            {
                Display.ShowMessage("Operation Not Specified!");
                return;
            }

            char[] wrong = { '/', ':', '?', '*', '<', '>', '|', '"' };

            string SrcFileName = args[1];

            if (Path.GetFileName(SrcFileName).IndexOfAny(wrong) >= 0)
            {
                Display.ShowMessage("Wrong Source File Path!");
                return;
            }

            if (!File.Exists(SrcFileName))
            {
                Display.ShowMessage("Source File Not Exists!");
                return;
            }

            string DstFileName = args[2];

            if (!Directory.Exists(Path.GetDirectoryName(DstFileName)) || Path.GetFileName(DstFileName).IndexOfAny(wrong) >= 0)
            {
                Display.ShowMessage("Wrong Destination File Path!");
                return;
            }

            if (File.Exists(DstFileName))
            {
                if (!Display.ShowMessage("Destination File Exists!\r\nDo You Want to Overwrite it? (y/n): ", true))
                {
                    return;
                }
                File.Delete(DstFileName);
            }

            GZip gz = null;

            if (Mode.Equals("compress"))
            {
                gz = new Compression(SrcFileName, DstFileName);
            }
            else
            {
                gz = new Decompression(SrcFileName, DstFileName);
            }
            gz.Process();
        }
예제 #3
0
파일: Program.cs 프로젝트: mamitko/GZipTest
        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;
        }