Написал несколько методов, читаем частями файл, далее сжимаем его, все кладем в очередь с готовыми блоками и потом блоки пишем в файл, использую сжатие данных и на выходе файл получается по размеру больше, чем исходный файл , подскажите почему так?
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);
}
}
}
Если верить MSDN:
Функциональные возможности сжатия в DeflateStream и GZipStream предоставляется в виде потока. Данные считываются на основе байт за байтом, поэтому невозможно выполнить несколько проходов для определения наилучшего метода сжатия целых файлов или больших блоков данных. DeflateStream И GZipStream лучше всего используются классы несжатого источников данных. Если исходные данные уже сжаты, использование этих классов может действительно увеличить размер потока.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости