gpt4 book ai didi

c# - 使用 System.IO.Compression.ZipArchive 时避免 MemoryStream.ToArray()

转载 作者:行者123 更新时间:2023-12-02 07:53:00 34 4
gpt4 key购买 nike

将字符串转换为压缩文本文件的辅助方法:

public static System.Net.Mail.Attachment CreateZipAttachmentFromString(string content, string filename)
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Update))
{
ZipArchiveEntry zipArchiveEntry = zipArchive.CreateEntry(filename);
using (StreamWriter streamWriter = new StreamWriter(zipArchiveEntry.Open()))
{
streamWriter.Write(content);
}

}

MemoryStream memoryStream2 = new MemoryStream(memoryStream.ToArray(), false);

return new Attachment(memoryStream2, filename + ".zip", MediaTypeNames.Application.Zip);
}
}

我真的希望避免将第一个内存流转换为数组,在其上创建另一个内存流来读取它,并将其传递给附件。我的逻辑是,为什么要将 X 兆字节复制到内存中的另一个位置来建立另一个指向副本的流,而这本质上就是我们开始时的情况。它相当于多兆字节的冗余,例如 if(myBool ==正确)

所以我想我应该寻找第一个内存流的开头,然后附件就可以读取它..或者我会建立另一个指向第一个内存流的缓冲区,并使用偏移量和长度参数设置以便它知道要读什么

这两种方法都不起作用,因为 ZipArchive 似乎只在控制权脱离 using block 并且 ziparchive 被释放时才将数据推送到内存流(在我的情况下可能)。处置它也会处置 MemoryStream 和几乎所有内容(除了 ToArray() 和 GetBuffer())都会抛出 ObjectDisposeException。

最终,在 ZipArchive 将数据注入(inject)其中之后和注入(inject)数据之前,我无法查找它或获取其长度,偏移量通常为零,长度肯定为零,因此这些值是无用的

是否有一种很好的最佳方法,无需配置我自己的过大缓冲区(这会使其无法通过 MemoryStream 扩展),以避免使用此方法消耗大约 2 倍存档大小的内存字节?

最佳答案

.NET 中大多数设计良好的流和流用户都有一个附加的 bool 参数,可用于指示它们在处置时保持“基本流”(可怕的名称)打开。

这是 ZipArchiveconstructor :

public ZipArchive(
Stream stream,
ZipArchiveMode mode,
bool leaveOpen
)

关于c# - 使用 System.IO.Compression.ZipArchive 时避免 MemoryStream.ToArray(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35022001/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com