using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using Ionic.Zip;
using ZipFile = Ionic.Zip.ZipFile;
namespace WebApplication5.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
private string zipFile = $@"e:\壓縮文件全部下載測試_{DateTime.Now.ToString("yyyyMMdd")}.rar";
private string[] files = new[]
{
"F:/BQ/xx/-2ed47457e8d3d0a0.jpg",
"F:/BQ/戰無不勝表情包/............. - 副本.bmp",
"E:/------/1.柱狀圖的用法/HighCharts柱狀圖的使用.png",
};
#region 第一種
/// <summary>
/// 第三方 Ionic.Zip(NuGet 搜索安裝)
/// </summary>
/// <returns></returns>
public string DownZip1()
{
string res = string.Empty;
//判斷是否存在
if (IsExist(zipFile))
{
//增量壓縮
using (ZipFile zip = new ZipFile(zipFile, Encoding.Default))
{
foreach (var item in zip.Entries)
{
res += item.FileName+',';
}
zip.UpdateFiles(files, "");
zip.Save();
}
//刪除文件
// DeleteFile(zipFile);
//下載文件
// Download1(zipFile.Replace(@"e:\", ""), zipFile);
// Download2(zipFile.Replace(@"e:\", ""), zipFile);
}
else
{
//設置路徑和編碼.設置編碼爲了防止 中文文件名亂碼
using (ZipFile zip = new ZipFile(zipFile, Encoding.Default))
{
//zip.Password = "123456"; //加密
zip.AddFiles(files, "");//添加文件
zip.Save();
}
res += $"共壓縮{files.Count()}個文件\n";
res += string.Join(Environment.NewLine, files.ToArray());
res += Environment.NewLine;
//刪除壓縮包中的某個文件
//DeleteFileInZip(zipFile, "-2ed47457e8d3d0a0.jpg");
}
return res;
}
#endregion 第一種
#region 第二種
/// <summary>
/// 微軟的(在添加引用中搜索)
/// 1.system.IO.Compression
/// 2.system.IO.Compression.FileSystem
/// </summary>
/// <returns></returns>
public string DownZip2()
{
string res = string.Empty;
try
{
//壓縮
using (ZipArchive archive = new ZipArchive(new FileStream(zipFile, FileMode.OpenOrCreate), ZipArchiveMode.Create))//Create,Read,Update
{
string path = string.Empty;
string filename = string.Empty;
for (int i = 0; i < files.Length; i++)
{
path = files[i];
ZipArchiveEntry readMeEntry = archive.CreateEntry(Path.GetFileName(path));
using (System.IO.Stream stream = readMeEntry.Open())
{
byte[] bytes = System.IO.File.ReadAllBytes(path);
stream.Write(bytes, 0, bytes.Length);
}
}
}
//讀取文件
using (ZipArchive archive = new ZipArchive(new FileStream(zipFile, FileMode.OpenOrCreate), ZipArchiveMode.Read))
{
int i = 1;
foreach (var zipArchiveEntry in archive.Entries)
{
res += i + ":" + zipArchiveEntry.FullName + ", ";
i++;
}
}
}
catch (Exception e)
{
throw e;
}
return res;
}
#endregion 第二種
#region DownHelper
/// <summary>
/// 刪除一個文件
/// </summary>
/// <param name="filePath"></param>
public void DeleteFile(string filePath)
{
System.IO.File.Delete(filePath);
}
/// <summary>
/// 從zip文件中刪除一個文件,注意無法直接刪除一個文件夾
/// </summary>
/// <param name="zipFilePath">zip路徑 eg:E:\\yangfeizai\\test.zip</param>
/// <param name="deleteFileName">要刪除文件的名稱(無法直接刪除文件夾) eg:Jayzai.xml</param>
public void DeleteFileInZip(string zipFilePath, string deleteFileName)
{
using (ZipFile zip = ZipFile.Read(zipFilePath))
{
//zip["Jayzai.xml"] = null;
zip.RemoveEntry(deleteFileName);
zip.Save();
}
}
/// <summary>
/// 檢查文件是否存在
/// </summary>
/// <returns></returns>
public bool IsExist(string filePath)
{
if (System.IO.File.Exists(filePath))
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 下載文件1
/// </summary>
/// <param name="fileName"></param>
/// <param name="filePath"></param>
public void Download1(string fileName, string filePath)
{
//string fileName = "aaa.txt";//客戶端保存的文件名
//string filePath = Server.MapPath("~/Document/123.txt");//路徑
FileInfo fileinfo = new FileInfo(filePath);
Response.Clear(); //清除緩衝區流中的所有內容輸出
Response.ClearContent(); //清除緩衝區流中的所有內容輸出
Response.ClearHeaders(); //清除緩衝區流中的所有頭
Response.Buffer = true; //該值指示是否緩衝輸出,並在完成處理整個響應之後將其發送
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", fileinfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/unknow"; //獲取或設置輸出流的 HTTP MIME 類型
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); //獲取或設置輸出流的 HTTP 字符集
Response.TransmitFile(filePath);
Response.End();
}
/// <summary>
/// 下載文件2
/// </summary>
/// <param name="fileName"></param>
/// <param name="filePath"></param>
public void Download2(string fileName, string filePath)
{
//string fileName = "aaa.txt";//客戶端保存的文件名
//string filePath = Server.MapPath("~/Document/123.txt");//路徑
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K 每次讀取文件,只讀取100K,這樣可以緩解服務器的壓力
byte[] buffer = new byte[ChunkSize];
Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;//獲取下載的文件總大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//讀取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
}
#endregion DownHelper
#region 解壓
//// 從 zip 文件中解壓出一個文件
//public void ExeSingleDeComp(string fileName)
//{
// using (ZipFile zip = ZipFile.Read(fileName))
// {
// // zip.Password = "123456";// 密碼解壓
// //Extract 解壓 zip 文件包的方法,參數是保存解壓後文件的路基
// zip["Jayzai.xml"].Extract(@"c:\\");
// }
//
//// 從 zip 文件中解壓全部文件
//public void ExeAllDeComp(string fileName)
//{
// using (ZipFile zip = ZipFile.Read(fileName))
// {
// //zip.Password = "123456";// 密碼解壓
// foreach (ZipEntry entry in zip)
// {
// //Extract 解壓 zip 文件包的方法,參數是保存解壓後文件的路基
// entry.Extract(@"c:\\");
// }
// }
//}
#endregion
}
}
.Net類庫 壓縮文件 與 Ionic.Zip 批量壓縮不同目錄文件與解壓 文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.