예제 #1
0
        public void Read()
        {
            try
            {
                int    countRead;
                byte[] buffer = new byte[bufferSize];

                using (FileStream input = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
                {
                    while ((countRead = input.Read(buffer, 0, bufferSize)) > 0 && !Canceler.IsCancel)
                    {
                        byte[] lastBuffer = new byte[countRead];
                        Buffer.BlockCopy(buffer, 0, lastBuffer, 0, countRead);

                        readBuffer.EnqueueBytes(lastBuffer);
                    }
                    readBuffer.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Canceler.Cancel();
                readBuffer.Close();
            }
        }
예제 #2
0
        public void Decompress(object threadNumber)
        {
            try
            {
                Chunk inputChunk;

                while (readBuffer.TryDequeue(out inputChunk) && !Canceler.IsCancel)
                {
                    using (MemoryStream memory = new MemoryStream(inputChunk.Buffer))
                    {
                        using (GZipStream gzip = new GZipStream(memory, CompressionMode.Decompress))
                        {
                            int    countRead;
                            byte[] buffer = new byte[bufferSize];

                            countRead = gzip.Read(buffer, 0, buffer.Length);

                            byte[] lastBuffer = new byte[countRead];
                            Buffer.BlockCopy(buffer, 0, lastBuffer, 0, countRead);
                            Chunk outputChunk = new Chunk(inputChunk.Id, lastBuffer);

                            writeBuffer.Enqueue(outputChunk);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Canceler.Cancel();
                readBuffer.Clear();
                writeBuffer.Clear();
            }
        }
예제 #3
0
        public void Write()
        {
            try
            {
                using (FileStream output = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    Chunk           chunk;

                    while (writeBuffer.TryDequeue(out chunk) && !Canceler.IsCancel)
                    {
                        formatter.Serialize(output, chunk);
                    }
                }
                if (Canceler.IsCancel)
                {
                    writeBuffer.Close();
                    File.Delete(outputFile);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Canceler.Cancel();
                writeBuffer.Clear();
                File.Delete(outputFile);
            }
        }
예제 #4
0
        public void Write()
        {
            try
            {
                using (FileStream output = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
                {
                    Chunk chunk;
                    while (writeBuffer.TryDequeue(out chunk) && !Canceler.IsCancel)
                    {
                        byte[] buffer = chunk.Buffer;

                        output.Write(buffer, 0, buffer.Length);
                    }
                }
                if (Canceler.IsCancel)
                {
                    writeBuffer.Close();
                    File.Delete(outputFile);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Canceler.Cancel();
                writeBuffer.Clear();
                File.Delete(outputFile);
            }
        }
예제 #5
0
        static void Main(string[] args)
        {
            var time = Stopwatch.StartNew();

            canceler = new Canceler();

            Console.CancelKeyPress += new ConsoleCancelEventHandler(cancelHandler);

            try
            {
                ValidateCommandLineInput(args);
                var mode       = args[0];
                var inputFile  = args[1];
                var outputFile = args[2];
                gzipper = new Gzipper(inputFile, outputFile, canceler);
                if (mode == "compress")
                {
                    gzipper.Compress();
                }
                else
                {
                    gzipper.Decompress();
                }


                Console.WriteLine($"time Elapsed - {time.Elapsed.TotalSeconds}");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                canceler.Cancel();
            }
        }
예제 #6
0
        public void Compress(object threadNumber)
        {
            try
            {
                Chunk inputChunk;

                while (readBuffer.TryDequeue(out inputChunk) && !Canceler.IsCancel)
                {
                    using (MemoryStream memory = new MemoryStream())
                    {
                        using (GZipStream gzip = new GZipStream(memory, CompressionMode.Compress))
                            using (BinaryWriter bwriter = new BinaryWriter(gzip))
                            {
                                bwriter.Write(inputChunk.Buffer, 0, inputChunk.Buffer.Length);
                            }

                        byte[] outBuffer   = memory.ToArray();
                        Chunk  outputChunk = new Chunk(inputChunk.Id, outBuffer);

                        writeBuffer.Enqueue(outputChunk);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Canceler.Cancel();
                readBuffer.Clear();
                writeBuffer.Clear();
            }
        }
예제 #7
0
        public void Read()
        {
            try
            {
                BinaryFormatter formatter = new BinaryFormatter();
                Chunk           chunk;

                using (FileStream input = new FileStream(inputFile, FileMode.Open, FileAccess.Read))
                {
                    while (input.Position < input.Length && !Canceler.IsCancel)
                    {
                        chunk = (Chunk)formatter.Deserialize(input);
                        readBuffer.Enqueue(chunk);
                    }
                    readBuffer.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Canceler.Cancel();
                readBuffer.Close();
            }
        }
예제 #8
0
 static void cancelHandler(object sender, ConsoleCancelEventArgs args)
 {
     Console.WriteLine("Progrem canceled by user");
     args.Cancel = true;
     canceler.Cancel();
 }