Ejemplo n.º 1
0
        private void COmpress(long streamStartPosition, int blockLength, int blockOrder)
        {
            //читаем часть из файла
            byte[] Buffer = new byte[blockLength]; // размер буфера
            using (var FS = File.OpenRead(inputPath))
            {
                FS.Seek(streamStartPosition, SeekOrigin.Begin);// устанавливаем позицию в потоке со смещением
                FS.Read(Buffer, 0, blockLength);
            }

            // сжимаем эту часть

            byte[] compresBuffer;

            using (var ms = new MemoryStream())
            {
                using (var GZ = new GZipStream(ms, CompressionMode.Compress, true))
                {
                    GZ.Write(Buffer, 0, Buffer.Length);
                }

                compresBuffer = ms.ToArray();
            }

            // отправляем на запись в очередь
            Semafor.Wait();
            buffer_Queue.Enqueue(blockOrder, compresBuffer);
            Console.Write("*"); // визуально показывает что операция идет
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Распаковываю  отдельный блок данных из исходного файла
        /// </summary>
        /// <param name="Position_in_stream">Смещение блока данных от начала файла</param>
        /// <param name="blockOrder">Порядок блока</param>
        private void DecompressBlock(long Position_in_stream, int blockOrder)
        {
            using (var inputStream = File.OpenRead(inputPath))
            {
                inputStream.Seek(Position_in_stream, SeekOrigin.Begin);

                using (var compressStream = new GZipStream(inputStream, CompressionMode.Decompress, true))
                {
                    int bufferNumber = 0;

                    byte[] buffer    = new byte[BlockSize];
                    int    bytesRead = compressStream.Read(buffer, 0, buffer.Length);
                    if (bytesRead < BlockSize)
                    {
                        Array.Resize(ref buffer, bytesRead);
                    }

                    byte[] nextBuffer = new byte[BlockSize];
                    while (bytesRead > 0)
                    {
                        bytesRead = compressStream.Read(nextBuffer, 0, nextBuffer.Length);

                        if (bytesRead < BlockSize)
                        {
                            Array.Resize(ref nextBuffer, bytesRead);
                        }

                        Semafor.Wait();
                        buffer_Queue.Enqueue(blockOrder, bufferNumber, buffer, nextBuffer.Length == 0);

                        buffer     = nextBuffer;
                        nextBuffer = new byte[BlockSize];

                        bufferNumber++;
                    }
                }
            }
        }