gpt4 book ai didi

c# - DotNetZip - 无法访问已关闭的流

转载 作者:太空宇宙 更新时间:2023-11-03 19:15:10 24 4
gpt4 key购买 nike

类似的问题都不是我要找的!

下面的代码有什么问题?files是文件内容的文本数组,fileNames是对应的文件名数组。

这段代码总是在倒数第二行的 Save 方法失败,但我不明白为什么流会被关闭!

result = new MemoryStream();

using (ZipFile zipFile = new ZipFile())
{
for (int i = 0; i < files.Count(); i++)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(files[i]);
using (MemoryStream fs = new MemoryStream(bytes))
{
zipFile.AddEntry(fileNames[i], fs);
}
}
zipFile.Save(result);
}

感谢您的帮助 - 在这里变得绝望!

这是我基于@spender 的第一条评论的解决方案,尽管他在下面发布的解决方案可能更好。

        try
{
result = new MemoryStream();
List<Stream> streams = new List<Stream>();

if (files.Count > 0)
{
using (ZipFile zipFile = new ZipFile())
{
for (int i = 0; i < files.Count(); i++)
{

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(files[i]);
streams.Add(new MemoryStream(bytes));
zipFile.AddEntry(fileNames[i], streams[i]);
}
zipFile.Save(result);
}
}
}
catch (Exception ex)
{
throw;
}

最佳答案

似乎调用Save 是读取源流的时间点。这意味着您必须在保存之前不对它们进行处理。在这种情况下放弃 using 语句,因为不可能将其范围扩展到循环之外。相反,收集您的 IDisposables 并在保存完成后处理它们。

result = new MemoryStream();

using (ZipFile zipFile = new ZipFile())
{
List<IDisposable> memStreams = new List<IDisposable>();
try
{
for (int i = 0; i < files.Count(); i++)
{
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(files[i]);
MemoryStream fs = new MemoryStream(bytes);
zipFile.AddEntry(fileNames[i], fs);
memStreams.Add(fs);
}
zipFile.Save(result);
}
finally
{
foreach(var x in memStreams)
{
x.Dispose();
}
}
}

关于c# - DotNetZip - 无法访问已关闭的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583227/

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