如何使用ZipArchive将存档创建为流或字节数组,而不是文件[重复]

问题描述 投票:1回答:1

为了测试某件事,我需要使用ZipArchive创建一个归档文件,而不是创建一个byte[]甚至更好的文件,而不是Stream。我发现下面的示例开始于:

using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
    {
        ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
        using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
        {
                writer.WriteLine("Information about this package.");
                writer.WriteLine("========================");
        }
    }
}

如果将FileStream替换为MemoryStream,我将无法获得结果。这是因为ZipArchiveStreamWriter“使用”在处置时会关闭流。另一方面,如果我不使用这些“用法”,则归档似乎已损坏,因为在尝试取消归档时出现错误。在我看来,存档已在ZipArchive处置中完成。

c# stream ziparchive
1个回答
-1
投票

您可以通过这种方式退出MemoryStream的使用块之前获取它的内容

using (MemoryStream zipToOpen = new MemoryStream())
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
    {
        ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
        using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
        {
            writer.WriteLine("Information about this package.");
            writer.WriteLine("========================");
        }
    }

    // At this point the StreamWriter is closed, the ZipArchive is disposed
    // but the MemoryStream buffer is still available and we can get it
    byte[] buffer = zipToOpen.GetBuffer();

    // Just a test to check if we have a correct "zip" buffer.
    File.WriteAllBytes(@"e:\temp\ziparchive.zip", buffer);
}
© www.soinside.com 2019 - 2024. All rights reserved.