Как сжать файл перед сохранением на диск? - PullRequest
5 голосов
/ 31 января 2012

Я хочу сжать файл перед физическим сохранением на диске.

Я пытался использовать методы сжатия и распаковки (пример кода MSDN), но для всех методов требуется файл, который уже физически хранится на диске.

Ответы [ 4 ]

7 голосов
/ 31 января 2012

Самый простой способ - открыть файл как Stream и обернуть его с помощью API сжатия, например GZipStream.

using (var fileStream = File.Open(theFilePath, FileMode.OpenOrCreate) {
  using (var stream = new GZipStream(fileStream, CompressionMode.Compress)) {
    // Write to the `stream` here and the result will be compressed
  }
}
4 голосов
/ 31 января 2012

Описание

Вы можете использовать класс GZipStream не только с fileName.Можно сжать Stream.

GZipStream Class Предоставляет методы и свойства, используемые для сжатия и распаковки потоков.

Образец

System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms,
        System.IO.Compression.CompressionMode.Compress);
// now you can save the file to disc

Дополнительная информация

0 голосов
/ 31 января 2012

Используйте MemoryStream и GZipStream.

Файл представляет собой массив байтов, поэтому вы можете попробовать следующий код в соответствии с http://www.dotnetperls.com/compress:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {

            byte[] text = Encoding.ASCII.GetBytes(new string('X', 10000));
            byte[] compress = Compress(text);

            Console.WriteLine("Compressed");
            foreach (var b in compress)
            {
                Console.WriteLine("{0} ", b);
            }
            Console.ReadKey();
        }

        public static byte[] Compress(byte[] raw)
        {
            using (var memory = new MemoryStream())
            {
                using (var gzip = new GZipStream(memory, CompressionMode.Compress, true))
                {
                    gzip.Write(raw, 0, raw.Length);
                }
                return memory.ToArray();
            }
        }
    }
}
0 голосов
/ 31 января 2012

Не можете ли вы использовать класс GZipStream?Он основан на потоке, поэтому вам не нужен файл на диске для использования этого класса.

Какой тип данных вы пытаетесь сжать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...