如何以更新/修改模式打开MemoryStream



我用下面的代码更新了一个zip文件(在内存中,完成后写入磁盘),但是我得到了如下错误消息

系统。Update模式需要一个带有read的流;写入和查找功能

代码:

public void Method()
{
DirectoryInfo directoryInfo = new DirectoryInfo(@"C:dir");
var pdfFileSet = directoryInfo.GetFiles().ToList();
MemoryStream memoryStream = new MemoryStream();
memoryStream.Close();
SingleZipFileMS(memoryStream, pdfFileSet);
}
public static MemoryStream SingleZipFileMS(MemoryStream memoryStream, List<FileInfo> filesToZip)
{
int x = ++i;
Console.WriteLine("Process: {0}", x);
using (ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Update))
{
foreach (var file in filesToZip)
zipArchive.CreateEntryFromFile(file.FullName, file.Name);
}
Console.WriteLine("Process: {0} completed", x);
return memoryStream;
}

将行memoryStream.Close();移动到SingleZipFileMS(memoryStream, pdfFileSet);之后,它将工作。ArgumentException: Update mode requires a stream with read, write, and seek capabilities.被抛出是因为MemoryStream在你使用它的时候是关闭的。所以在结束之前不要关闭它,你应该会没事的。

public void Method()
{
var pdfFileSet = new List<FileInfo>() {new System.IO.FileInfo("temp.txt")};
//Some code
MemoryStream memoryStream = new MemoryStream();
//memoryStream.Close();  Move this to after
SingleZipFileMS(memoryStream, pdfFileSet);

memoryStream.Close(); // Like this
}
public static MemoryStream SingleZipFileMS(MemoryStream memoryStream, List<FileInfo> filesToZip)
{
using (ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Update))
{
foreach (var file in filesToZip)
zipArchive.CreateEntryFromFile(file.FullName, file.Name);
}
return memoryStream;
}

更简洁的方法是使用using语句在适当的时间关闭MemoryStream。

public void Method()
{
var pdfFileSet = new List<FileInfo>() {new System.IO.FileInfo("temp.txt")};
//Some code
using MemoryStream memoryStream = new MemoryStream();
SingleZipFileMS(memoryStream, pdfFileSet);
}

最新更新