Использование MemoryStream и DotNetZip для архивирования json-файла

У меня есть файл JSON, и я собираюсь заархивировать его с помощью DotNetZip. Использование с StreamWriter для zip работает, если я попытаюсь использовать MemoryStream, это не сработает.

StreamWriter:

sw = new StreamWriter(assetsFolder + @"manifest.json");
sw.Write(strManifest);
sw.Close();
zip.AddFile(Path.Combine(assetsFolder, "manifest.json"), "/");
zip.AddFile(Path.Combine(assetsFolder, "XXXXXXX"), "/");
zip.Save(outputStream);

Поток Памяти:

var manifestStream = GenerateStreamFromString(strManifest);
public static Stream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}
zip.AddEntry("manifest.json", manifestStream);  
zip.AddFile(Path.Combine(assetsFolder, "XXXXXXX"), "/");
zip.Save(outputStream);

Я должен использовать тип файла .JSON, чтобы заархивировать его. Может ли кто-нибудь сказать мне, где ошибка?


person Yuk_dev    schedule 30.11.2016    source источник
comment
Это выглядит правильно. Вы уверены, что ваши пути указаны правильно?   -  person Leon    schedule 30.11.2016
comment
Если я правильно понимаю, вы хотели gzip своего JSON, я прав?   -  person Ali Bahrami    schedule 30.11.2016
comment
@Leon Husmann Да, путь к assetsFolder правильный, действительно ли он zip.AddEntry создает область потока для сохранения этого файла json?   -  person Yuk_dev    schedule 30.11.2016
comment
@Али Да, ты прав   -  person Yuk_dev    schedule 30.11.2016
comment
@YukwongTsang да, так и должно быть. Можете ли вы попробовать следующее: примеры DotNetZip   -  person Leon    schedule 30.11.2016


Ответы (1)


Чтобы создать Gzip Json, вам нужно использовать GZipStream. Попробуйте метод ниже.

https://www.dotnetperls.com/gzipstream

GZipStream сжимает данные. Он эффективно сохраняет данные, например, в сжатых файлах журналов. Мы разрабатываем служебный метод на языке C#, который использует пространство имен System.IO.Compression. Он создает файлы GZIP. Он записывает их на диск.

    public static void CompressStringToFile(string fileName, string value)
    {
        // A.
        // Write string to temporary file.
        string temp = Path.GetTempFileName();
        File.WriteAllText(temp, value);

        // B.
        // Read file into byte array buffer.
        byte[] b;
        using (FileStream f = new FileStream(temp, FileMode.Open))
        {
            b = new byte[f.Length];
            f.Read(b, 0, (int)f.Length);
        }

        // C.
        // Use GZipStream to write compressed bytes to target file.
        using (FileStream f2 = new FileStream(fileName, FileMode.Create))
        using (GZipStream gz = new GZipStream(f2, CompressionMode.Compress, false))
        {
            gz.Write(b, 0, b.Length);
        }
    }
person Ali Bahrami    schedule 30.11.2016
comment
Извините, у меня есть вопрос. GZipped требуется для создания реального файла для записи строки в поток, есть ли какой-либо метод без использования реального файлового потока? В любом случае, спасибо за ваш ответ! - person Yuk_dev; 30.11.2016
comment
Не могли бы вы описать больше? создать настоящий файл? - person Ali Bahrami; 30.11.2016