代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Asp.NET
】
实现文件夹及文件压缩,并实现下载(二)
作者:
刺猬拥抱
/ 发布于
2017/10/25
/
1059
该方法不会在服务器中保存压缩文件 文件若超过150M则会分块压缩文件。虽然能压缩大型的文件,但大型文件过大或者整体的文件过大 ,也会报错,如:引发类型为“System.OutOfMemoryException”的异常。
添加引用:ICSharpCode.SharpZipLib.dll 代码: #region 压缩并下载代码 private void dlZipDir(string strPath, string strFileName) { MemoryStream ms = null; try { Response.ContentType = "application/octet-stream"; strFileName = HttpUtility.UrlEncode(strFileName).Replace('+', ' '); Response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName + ".zip"); ms = new MemoryStream(); zos = new ZipOutputStream(ms); strBaseDir = strPath + "\\"; addZipEntry(strBaseDir); zos.Finish(); zos.Close(); Response.Clear(); Response.BinaryWrite(ms.ToArray()); Response.End(); } catch (Exception ex) { if (ms != null) ms.Close(); if (zos != null) zos.Close(); } } private void addZipEntry(string path) { Crc32 crc = new Crc32(); FileStream fs = null; try { DirectoryInfo di = new DirectoryInfo(path); foreach (DirectoryInfo item in di.GetDirectories()) { addZipEntry(item.FullName); } foreach (FileInfo item in di.GetFiles()) { fs = File.OpenRead(item.FullName); if (fs.Length != 0) { long fileLength = fs.Length; long pai = 1024 * 1024 * 20;//每20M写一次 long forint = fs.Length / pai + 1; byte[] buffer = null; ZipEntry entry = null; if (fileLength < 104857600)//150 * 1024 * 1024 { buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string strEntryName = item.FullName.Replace(strBaseDir, ""); entry = new ZipEntry(strEntryName); zos.PutNextEntry(entry); zos.Write(buffer, 0, buffer.Length); } else //超过150M则会分块处理 { entry = new ZipEntry(item.FullName.Replace(strBaseDir, "")); entry.Size = fs.Length; entry.DateTime = DateTime.Now; zos.PutNextEntry(entry); for (long i = 1; i <= forint; i++) { if (pai * i < fs.Length) { buffer = new byte[pai]; fs.Seek(pai * (i - 1), System.IO.SeekOrigin.Begin); } else { if (fs.Length < pai) { buffer = new byte[fs.Length]; } else { buffer = new byte[fs.Length - pai * (i - 1)]; fs.Seek(pai * (i - 1), System.IO.SeekOrigin.Begin); } } fs.Read(buffer, 0, buffer.Length); crc.Reset(); crc.Update(buffer); zos.Write(buffer, 0, buffer.Length); zos.Flush(); } } } fs.Close(); } } catch (Exception ex) { if (fs != null) fs.Close(); } } 调用 protected void Button1_Click(object sender, EventArgs e) { string filePath = Server.MapPath("files"); dlZipDir(filePath, "files"); } 该方法不会在服务器中保存压缩文件 文件若超过150M则会分块压缩文件。虽然能压缩大型的文件,但大型文件过大或者整体的文件过大 ,也会报错,如:引发类型为“System.OutOfMemoryException”的异常。
试试其它关键字
同语言下
.
gzip压缩
.
实现http多线程断点续传下载文件
.
实现多线程断点续传下载大文件
.
生成字符串的 CheckSum
.
根据 UserAgent 获取浏览器的类型和版本
.
根据 Agent 判断是否是智能手机
.
隐藏手机号中间四位为*方法
.
合并图片(二维码和其他图片合并)
.
ASP.NET CORE中判断是否移动端打开网页
.
ASP.NET(C#)实现页面计时(定时)自动跳转
可能有用的
.
gzip压缩
.
实现http多线程断点续传下载文件
.
实现多线程断点续传下载大文件
.
生成字符串的 CheckSum
.
根据 UserAgent 获取浏览器的类型和版本
.
根据 Agent 判断是否是智能手机
.
隐藏手机号中间四位为*方法
.
合并图片(二维码和其他图片合并)
.
ASP.NET CORE中判断是否移动端打开网页
.
ASP.NET(C#)实现页面计时(定时)自动跳转
刺猬拥抱
贡献的其它代码
(
14
)
.
如何获取视频的总时长
.
敏感字符串处理工具类
.
字符串字典序排序
.
实现文件夹及文件压缩,并实现下载(二)
.
DataTable转Json Json转DataTable
.
google suggest 下拉菜单(asp.net版本)
.
在SQL2008查找某数据库中的列是否存在某个值
.
WebApiClient
.
json内查询
.
repeater 当前行号
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3