Почему при архивации файл получается по размеру больше чем исходный файл

186
23 сентября 2018, 20:00

Написал несколько методов, читаем частями файл, далее сжимаем его, все кладем в очередь с готовыми блоками и потом блоки пишем в файл, использую сжатие данных и на выходе файл получается по размеру больше, чем исходный файл , подскажите почему так?

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.IO.Compression;
namespace ConsoleApplication57
{
    class Program
    {
        static void Main(string[] args)
        {
 string path = @"d:\Black Widow.m4a";
 string path_compres = @"d:\Compress.gz";

// создаем очередь c блоками ланных
        Queue<KeyValuePair<int, byte[]>> queue_block = new Queue<KeyValuePair<int, byte[]>>();
// создаем очередь с готовыми обработанными блоками
        Queue<KeyValuePair<int, byte[]>> readyQueue = new Queue<KeyValuePair<int, byte[]>>();

// открываем поток
            using (var fs = new FileStream(path, FileMode.Open))

// добавляем в очередь блоки
            foreach (KeyValuePair<int, byte[]> block in Read_Blockk(fs))
        {
            queue_block.Enqueue(block);
        }

    // сжимаем и добавляем в готовую очередь        
            while (queue_block.Count>0)
            {
                var block = queue_block.Dequeue();
                var compressionBlock = COmpress(block.Key, block.Value);
                readyQueue.Enqueue(compressionBlock);
            }
     // пишем в файл блоки

            while (readyQueue.Count!=0)
            {
                Write_Final_File(path_compres,readyQueue.Dequeue().Value);
            }

Console.ReadKey();

        }

        public static IEnumerable<KeyValuePair<int,byte[]>> Read_Blockk(Stream stream)
        {
            const int size_block=1024 * 1024; // определяем размер буфера=1мб
            int index = 0; // номер блока
            while (stream.Position<stream.Length)
            {
                // выделяем память под массив буффера.
                byte[] buffer=new byte[System.Math.Min(size_block,stream.Length-stream.Position)];
                stream.Read(buffer, 0, buffer.Length);
                yield return new KeyValuePair<int, byte[]>(index++,buffer);
            }
        }

        public static KeyValuePair<int, byte[]> COmpress(int index,byte[] block)
        {
            using (var ms = new MemoryStream())
            using (var gzStream=new GZipStream(ms,CompressionMode.Compress))
            {
                int ind = index;
                gzStream.Write(block,0,block.Length);
                gzStream.Close();
                 return new KeyValuePair<int, byte[]>(ind++,ms.ToArray());
                }
            }
        public static void Write_Final_File(string path,    byte[] ReadyBlock)
        {
            using (var fsWrite = new FileStream(path, FileMode.Append, FileAccess.Write))
            fsWrite.Write(ReadyBlock,0,ReadyBlock.Length);

        }

        }

    }
Answer 1

Если верить MSDN:

Функциональные возможности сжатия в DeflateStream и GZipStream предоставляется в виде потока. Данные считываются на основе байт за байтом, поэтому невозможно выполнить несколько проходов для определения наилучшего метода сжатия целых файлов или больших блоков данных. DeflateStream И GZipStream лучше всего используются классы несжатого источников данных. Если исходные данные уже сжаты, использование этих классов может действительно увеличить размер потока.

READ ALSO
АНИМАЦИЯ выезжающего окна в XAML, C#, WPF.

АНИМАЦИЯ выезжающего окна в XAML, C#, WPF.

помогите с анимациейУ меня при нажатии на кнопку выдвигается окно

414
Session на разных под доменах

Session на разных под доменах

У меня в точности идентичный вопрос как тут How can I share a session across multiple subdomains in ASPNET? только мне не помогла строка:

177
Подключение файла cs из вложенной папки в проект

Подключение файла cs из вложенной папки в проект

Как подключить файл cs из вложенной папки в проектеПри подключении имеющегося элемента в проект файл появляется в корне проекта, а нужно подключить...

212