SharpZipLib не может использовать StreamWriter для записи текста во вновь созданный CSV-файл - PullRequest
2 голосов
/ 24 февраля 2012

Мне кажется, что я не могу писать текст через StreamWriter во вновь создаваемый zip-файл (не в gzip). Я использую SharpZipLib и не совсем понимаю, как заставить его работать. DJ Kraze помог мне с потоковым контентом из заархивированного текстового файла в StreamReader, теперь я попробую обратное. Я не хочу сначала создавать файл csv, а затем сжимать окончательный файл, но хотел бы передавать текст непосредственно в создаваемый файл csv в контейнере zip. Это возможно? Ниже фрагмента, который я использую для получения потока, который я могу использовать с StreamReader, он просто дает представление о том, что я ищу, просто на этот раз мне нравится получать поток для использования с StreamWriter.

public static Stream GetZipInputFileStream(string fileName)
{
    ZipInputStream zip = new ZipInputStream(File.OpenRead(fileName));
    FileStream filestream = 
        new FileStream(fileName, FileMode.Open, FileAccess.Read);
    ZipFile zipfile = new ZipFile(filestream);
    ZipEntry item;

    if ((item = zip.GetNextEntry()) != null)
    {
        return zipfile.GetInputStream(item);
    }
    else
    {
        return null;
    }
}

Вот как я его использую, который я по сути ищу, но наоборот (StreamWriter -> новый CSV-файл в новом zip-контейнере):

using (StreamReader streamReader = Path.GetExtension(fileName).ToUpper().Equals(".ZIP") ? new StreamReader(FileOperations.GetZipInputFileStream(fileName)) : new StreamReader(fileName))
            {

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Я закончил тем, что выгрузил SharpZipLib для этой цели и вместо этого пошел более интенсивным путем: сначала распаковать все файлы в zip-контейнере, обработать данные и затем переместить файлы обратно в zip-контейнер. Проблема, с которой я столкнулся, как описано выше, состояла в том, что я не мог прочитать ни один из файлов в контейнере сразу из-за их большого размера. Было бы неплохо увидеть библиотеку zip, которая в будущем сможет обрабатывать частичную запись потока в контейнер, но сейчас я не нашел способа сделать это с помощью SharpZipLib.

0 голосов
/ 24 февраля 2012

Второй пример здесь адресует запись потока непосредственно в zip-файл из SharpZipLib. Давайте посмотрим, как это работает для вас.

Редактировать: поскольку ссылка проблематична, ниже приведен пример из вики.

public void UpdateZipInMemory(Stream zipStream, Stream entryStream, String entryName) 
{

    // The zipStream is expected to contain the complete zipfile to be updated
    ZipFile zipFile = new ZipFile(zipStream);

    zipFile.BeginUpdate();

    // To use the entryStream as a file to be added to the zip,
    // we need to put it into an implementation of IStaticDataSource.
    CustomStaticDataSource sds = new CustomStaticDataSource();
    sds.SetStream(entryStream);

    // If an entry of the same name already exists, it will be overwritten; otherwise added.
    zipFile.Add(sds, entryName);

    // Both CommitUpdate and Close must be called.
    zipFile.CommitUpdate();

    // Set this so that Close does not close the memorystream
    zipFile.IsStreamOwner = false;
    zipFile.Close();

    // Reposition to the start for the convenience of the caller.
    zipStream.Position = 0;
}

И вспомогательная структура данных

public class CustomStaticDataSource : IStaticDataSource
{
    private Stream _stream;

    // Implement method from IStaticDataSource
    public Stream GetSource() { return _stream; }

    // Call this to provide the memorystream
    public void SetStream(Stream inputStream) 
    {
        _stream = inputStream;
        _stream.Position = 0;
    }
}

Есть пример вызова этого кода, если вы можете попасть на сайт.

...