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

获知微软提供了一个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/archive/2011/05/11/2043425.html

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

  1. java编程笔记18 文件压缩与解压缩

    在java中,主要是利用ZipEntry,ZipInputStream和ZipOutputStream来实现zip数据压缩方式的编程方法, 构造方法摘要 ZipEntry(String name)   ...

  2. 文件压缩、解压 (ZipTool.exe)

     工具下载 压缩: 调用zip()函数. 解压缩:调用unzip()函数 添加ZipTool类至应用中,即可实现文件压缩.解压逻辑. using System; using System.Collec ...

  3. 利用System.IO.Compression操作压缩文件

    引用: using System.IO.Compression; using (FileStream zipToOpen = new FileStream(@"D:\json.zip&quo ...

  4. 利用System.IO.Compression实现文件压缩和解压缩

    以下内容来自:blogs.msdn.com .NET System.IO.Compression and zip files .NET Zip Library .NET 2.0 does Compre ...

  5. .Net 文件流 System.IO之Stream

    转自 :http://www.cnblogs.com/yukaizhao/archive/2011/07/28/stream.html Stream在msdn的定义:提供字节序列的一般性视图(prov ...

  6. 安卓上为什么不能用system.io.file读取streammingAssets目录下的文件

    安卓上为什么不能用system.io.file读取streammingAssets目录下的文件 首先,看文档: Streaming Assets Most assets in Unity are co ...

  7. C# 读写文件时抛出异常“System.IO.IOException: 文件“xxx”正由另一进程使用,因此该进程”

    问题描述 A程序不断的将日志信息追加到日志文件的末尾,B程序不断的从日志文件中读取最后一行(使用File.ReadLines(string path)方法). 在B程序读取的同时A程序执行写入,报出如 ...

  8. .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。

    在解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录.. 其原因是所解压的文件并非 zip 文件. 本文内容 异常 原因 异常 在解压 ...

  9. 服务器 网络文件夹,System.IO.FileSystemWatcher监视网络服务器文件夹 - 性能注意事项(Sys...

    我想看更改网络服务器上的文件夹树. 这些文件都具有特定的扩展. 有树约200文件夹和带我看的延长约1200文件. 我不能写一个服务,在服务器上运行(禁地!),所以解决方案必须是本地的客户端. 及时性不 ...

最新文章

  1. VS2008常见编译错误(总结篇)
  2. 【opencv4】opencv视频教程 C++ 7、手动调整图像亮度与对比度 g(i, j) = αf(i, j) + β(点操作与邻域操作概念)
  3. spark 2.4.5 简单使用
  4. java输入流的控制_Java-Android-IO流-控制台输入输出
  5. adb 输入回车命令_adb adb shell 相关命令
  6. java 蓝牙4.0_《蓝牙4.0 BLE开发完全手册---物联网开发技术实战
  7. hdu-1176(dp)
  8. SQL笔记(1)索引/触发器
  9. Python爬取B站弹幕+Gephi梳理主线剧情
  10. 计量分析类论文如何创新-化柏林
  11. Python和Java哪个更好找工作?
  12. Docker DeskTop安装Jenkins教程[Windows]
  13. 第七次人口普查数据可视化分析实战——基于pyecharts(含数据和源码)
  14. 证券公司八大业务最全梳理
  15. 数字验证和table格式(KAYAK)
  16. Spring整合Quartz实现动态定时器
  17. 什么是跨域及怎么解决跨域问题?
  18. 团体标准的意义,办理团体标准的好处
  19. 二叉树的基本原理和性质(初学必看)
  20. pythonl list 的修改元素

热门文章

  1. OpenStack虚机网卡的创建过程
  2. 《javascript设计模式》笔记之第十章 和 第十一章:门面模式和适配器模式
  3. 碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞
  4. iOS高效开发必备的10款Objective-C类库
  5. vs2005无法断点调试网站,断点失效
  6. Android中的定时器AlarmManager
  7. Android 解析 Unable to add window is your activity running?
  8. 算法-----------数组------------只出现一次的数字
  9. 如何取消或定制当点击GridView 的时候出现的那个黄色背景
  10. Spark UDF用户自定义函数