使用System.IO.Packaging.Package进行文件压缩所产生的问题

最近在项目中需要进行文件压缩,即将打包好的压缩文件提供给用户,用户进行下载。

获知微软提供了一个System.IO.Packaging.Package的类,从而可以进行打包,那么我就进行了使用。谁知道,这一用就用出事了。

首先看代码吧。

结构并不复杂,vs2010+mvc3,直接写在action里。(例子是这样写的)需要注意的是,System.IO.Packaging.Package是在WindowsBase.dll里的。

private const long BUFFER_SIZE = 4096;
public ActionResult DownLoad(int id)
{
//实际情况中,此处将会根据id从数据库中获得数据列表
//此列表中将包括需要压缩的文件名
try
{
byte[] file = null;
//假设,有一个download目录,作为下载目录,其中包含若干文件
string folder = Server.MapPath("~/download/");
DirectoryInfo f
= new DirectoryInfo(folder);
using (MemoryStream ms = new MemoryStream())
{
using (Package zip = Package.Open(ms, FileMode.Create))//使用内存流打开
{
//在实际情况中,此处将会是一个循环,从数据库中获得一批需要进行压缩的文件路径
//获得相对根路径
Uri uri = PackUriHelper.CreatePartUri(new Uri("文件路径", UriKind.Relative));
if (zip.PartExists(uri))//如果此文件已存在,删掉
{
zip.DeletePart(uri);
}
PackagePart part
= zip.CreatePart(uri, "", CompressionOption.Normal);
//使用文件流打开需要压缩的文件
using (FileStream fileStream = new FileStream(folder + "文件路径", FileMode.Open, FileAccess.Read))
{
using (Stream dest = part.GetStream())
{
//将数据复制到stream中
CopyStream(fileStream, dest);
}
}
//此处对应循环结束
}
file
= ms.ToArray();
}
return File(file, "application/x-zip-compressed", "myFile.zip");
}
catch (Exception ex)
{

return View("Error");
}
}

private static void CopyStream(System.IO.Stream inputStream, System.IO.Stream outputStream)
{
long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE;
byte[] buffer = new byte[bufferSize];
int bytesRead = 0;
long bytesWritten = 0;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0)
{
outputStream.Write(buffer,
0, bytesRead);
bytesWritten
+= bufferSize;
}
}

虽然我对于流的理解并不是很好,但是大概的代码思路还是有的。感觉这里并没什么问题。可是,结果却并非我所想象的那样。

首先,在本地进行测试,并无错误。

然后部署到IIS中,其中包括iis7和iis6.一开始并不报错,但是后来就开始出错了。

报的最频繁的错误就是,无法访问已关闭的流。

还有一个是什么具体的忘记了。最直观的就是,当下载的压缩包并不大时,大概在20-30M左右,没事。一旦在大点,就开始报错了。

这让我很不能理解。

我在一台服务器上设置了everyone的权限,没事了,当去掉everyone的权限后,错误又出现了。

此时,开始考虑错误。

个人的想法是:压缩包从内存流中读取,然后通过文件流进行写入,此时应当会产生一个临时文件,但是这个临时文件的大小是受限的,一旦太大

就无法继续进行写入了。从而关闭文件流。

当然,到底是否是正确的,还无从得知。因为,到现在也没有获得正确的答案。

最终使用了另外的一种压缩方法进行压缩。

在此,将问题抛出,静等园内众神指点解惑。

PS:貌似直接ouputstream不行。

原文地址:https://www.cnblogs.com/fengyishou/p/2043425.html