使用System.IO.Packaging.Package进行文件压缩所产生的问题
最近在项目中需要进行文件压缩,即将打包好的压缩文件提供给用户,用户进行下载。
获知微软提供了一个System.IO.Packaging.Package的类,从而可以进行打包,那么我就进行了使用。谁知道,这一用就用出事了。
首先看代码吧。
结构并不复杂,vs2010+mvc3,直接写在action里。(例子是这样写的)需要注意的是,System.IO.Packaging.Package是在WindowsBase.dll里的。
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进行文件压缩所产生的问题相关推荐
- java编程笔记18 文件压缩与解压缩
在java中,主要是利用ZipEntry,ZipInputStream和ZipOutputStream来实现zip数据压缩方式的编程方法, 构造方法摘要 ZipEntry(String name) ...
- 文件压缩、解压 (ZipTool.exe)
工具下载 压缩: 调用zip()函数. 解压缩:调用unzip()函数 添加ZipTool类至应用中,即可实现文件压缩.解压逻辑. using System; using System.Collec ...
- 利用System.IO.Compression操作压缩文件
引用: using System.IO.Compression; using (FileStream zipToOpen = new FileStream(@"D:\json.zip&quo ...
- 利用System.IO.Compression实现文件压缩和解压缩
以下内容来自:blogs.msdn.com .NET System.IO.Compression and zip files .NET Zip Library .NET 2.0 does Compre ...
- .Net 文件流 System.IO之Stream
转自 :http://www.cnblogs.com/yukaizhao/archive/2011/07/28/stream.html Stream在msdn的定义:提供字节序列的一般性视图(prov ...
- 安卓上为什么不能用system.io.file读取streammingAssets目录下的文件
安卓上为什么不能用system.io.file读取streammingAssets目录下的文件 首先,看文档: Streaming Assets Most assets in Unity are co ...
- C# 读写文件时抛出异常“System.IO.IOException: 文件“xxx”正由另一进程使用,因此该进程”
问题描述 A程序不断的将日志信息追加到日志文件的末尾,B程序不断的从日志文件中读取最后一行(使用File.ReadLines(string path)方法). 在B程序读取的同时A程序执行写入,报出如 ...
- .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
在解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录.. 其原因是所解压的文件并非 zip 文件. 本文内容 异常 原因 异常 在解压 ...
- 服务器 网络文件夹,System.IO.FileSystemWatcher监视网络服务器文件夹 - 性能注意事项(Sys...
我想看更改网络服务器上的文件夹树. 这些文件都具有特定的扩展. 有树约200文件夹和带我看的延长约1200文件. 我不能写一个服务,在服务器上运行(禁地!),所以解决方案必须是本地的客户端. 及时性不 ...
最新文章
- VS2008常见编译错误(总结篇)
- 【opencv4】opencv视频教程 C++ 7、手动调整图像亮度与对比度 g(i, j) = αf(i, j) + β(点操作与邻域操作概念)
- spark 2.4.5 简单使用
- java输入流的控制_Java-Android-IO流-控制台输入输出
- adb 输入回车命令_adb adb shell 相关命令
- java 蓝牙4.0_《蓝牙4.0 BLE开发完全手册---物联网开发技术实战
- hdu-1176(dp)
- SQL笔记(1)索引/触发器
- Python爬取B站弹幕+Gephi梳理主线剧情
- 计量分析类论文如何创新-化柏林
- Python和Java哪个更好找工作?
- Docker DeskTop安装Jenkins教程[Windows]
- 第七次人口普查数据可视化分析实战——基于pyecharts(含数据和源码)
- 证券公司八大业务最全梳理
- 数字验证和table格式(KAYAK)
- Spring整合Quartz实现动态定时器
- 什么是跨域及怎么解决跨域问题?
- 团体标准的意义,办理团体标准的好处
- 二叉树的基本原理和性质(初学必看)
- pythonl list 的修改元素
热门文章
- OpenStack虚机网卡的创建过程
- 《javascript设计模式》笔记之第十章 和 第十一章:门面模式和适配器模式
- 碰撞检测算法:点和矩形碰撞、点和圆形碰撞、矩形碰撞、圆形碰撞
- iOS高效开发必备的10款Objective-C类库
- vs2005无法断点调试网站,断点失效
- Android中的定时器AlarmManager
- Android 解析 Unable to add window is your activity running?
- 算法-----------数组------------只出现一次的数字
- 如何取消或定制当点击GridView 的时候出现的那个黄色背景
- Spark UDF用户自定义函数