Zipowanie danych z Enumeratora

0

Witam,

Mam problem ze skompresowaniem w pamięci dużego bloku danych tekstowych które dostaję w enumeratorze. Nie wiem dokładnie ile tych danych będzie (na 100% dane wejściowe nie zmieszczą się w pamięci) a chciałbym całość skompresować bez tworzenia plików pośrednich. Potrzebuję biblioteki która pozwoli mi dodawanie zawartości pojedynczego ZipEntry w porcjach a nie w całości. Coś w rodzaju:

var memoryStream = new MemoryStream();
using(var zip = new ZipFile())
{
var zipEntry = zip.NewEntry();
zipEntry.Name = "moj plik";
foreach(var record in records)
{
zipEntry.AppendBytes(record.ToBytes());
}
zip.Add(zipEntry);
zip.Save(memoryStream);
memoryStream.Position = 0
}

Pozdrawiam,

mr-owl

0

Witam,

Urodziłem coś takiego, czy da się to może zrobić jakoś lepiej?

namespace SampleProgram
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.IO.Compression;
    using System.Net;
    using System.Text;

    public static class Program
    {
        public static void Main(string[] args)
        {
            using (var memoryStream = new MemoryStream())
            {
                using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
                {
                    var entry = zipArchive.CreateEntry("sample.txt");
                    using (var streamWriter = new StreamWriter(entry.Open()))
                    {
                        foreach (string record in GetRecords())
                        {
                            streamWriter.Write(record);
                        }
                    }
                }

                memoryStream.Position = 0;

                using (var webClient = new WebClient())
                {
                    webClient.Credentials = new NetworkCredential("anonymous", "[email protected]");
                    webClient.UploadData("ftp://127.0.0.1/sample.zip", memoryStream.ToArray());
                }
            }
        }

        public static IEnumerable<string> GetRecords()
        {
            for (int i = 0; i < 10000; i++)
            {
                yield return string.Format("{0:00000000}\n", i);
            }
        }
    }
}

Pozdrawiam,

mr-owl

1 użytkowników online, w tym zalogowanych: 0, gości: 1