c#使用DotNetZip封裝類操作zip文件(創(chuàng)建/讀取/更新)實例
下載地址在這里:http://dotnetzip.codeplex.com/
下載到的包里有很多個dll文件,一般引用Ionic.Zip.dll就可以:
然后引用這個命名空間:
using Ionic.Zip;
以下是我自己封裝的一個類:
/// <summary>
/// Zip操作基于 DotNetZip 的封裝
/// </summary>
public static class ZipUtils
{
/// <summary>
/// 得到指定的輸入流的ZIP壓縮流對象【原有流對象不會改變】
/// </summary>
/// <param name="sourceStream"></param>
/// <returns></returns>
public static Stream ZipCompress(Stream sourceStream, string entryName = "zip")
{
MemoryStream compressedStream = new MemoryStream();
if (sourceStream != null)
{
long sourceOldPosition = 0;
try
{
sourceOldPosition = sourceStream.Position;
sourceStream.Position = 0;
using (ZipFile zip = new ZipFile())
{
zip.AddEntry(entryName, sourceStream);
zip.Save(compressedStream);
compressedStream.Position = 0;
}
}
catch
{
}
finally
{
try
{
sourceStream.Position = sourceOldPosition;
}
catch
{
}
}
}
return compressedStream;
}
/// <summary>
/// 得到指定的字節(jié)數(shù)組的ZIP解壓流對象
/// 當(dāng)前方法僅適用于只有一個壓縮文件的壓縮包,即方法內(nèi)只取壓縮包中的第一個壓縮文件
/// </summary>
/// <param name="sourceStream"></param>
/// <returns></returns>
public static Stream ZipDecompress(byte[] data)
{
Stream decompressedStream = new MemoryStream();
if (data != null)
{
try
{
MemoryStream dataStream = new MemoryStream(data);
using (ZipFile zip = ZipFile.Read(dataStream))
{
if (zip.Entries.Count > 0)
{
zip.Entries.First().Extract(decompressedStream);
// Extract方法中會操作ms,后續(xù)使用時必須先將Stream位置歸零,否則會導(dǎo)致后續(xù)讀取不到任何數(shù)據(jù)
// 返回該Stream對象之前進(jìn)行一次位置歸零動作
decompressedStream.Position = 0;
}
}
}
catch
{
}
}
return decompressedStream;
}
/// <summary>
/// 壓縮ZIP文件
/// 支持多文件和多目錄,或是多文件和多目錄一起壓縮
/// </summary>
/// <param name="list">待壓縮的文件或目錄集合</param>
/// <param name="strZipName">壓縮后的文件名</param>
/// <param name="IsDirStruct">是否按目錄結(jié)構(gòu)壓縮</param>
/// <returns>成功:true/失?。篺alse</returns>
public static bool CompressMulti(List<string> list, string strZipName, bool IsDirStruct)
{
try
{
using (ZipFile zip = new ZipFile(Encoding.Default))//設(shè)置編碼,解決壓縮文件時中文亂碼
{
foreach (string path in list)
{
string fileName = Path.GetFileName(path);//取目錄名稱
//如果是目錄
if (Directory.Exists(path))
{
if (IsDirStruct)//按目錄結(jié)構(gòu)壓縮
{
zip.AddDirectory(path, fileName);
}
else//目錄下的文件都壓縮到Zip的根目錄
{
zip.AddDirectory(path);
}
}
if (File.Exists(path))//如果是文件
{
zip.AddFile(path);
}
}
zip.Save(strZipName);//壓縮
return true;
}
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 解壓ZIP文件
/// </summary>
/// <param name="strZipPath">待解壓的ZIP文件</param>
/// <param name="strUnZipPath">解壓的目錄</param>
/// <param name="overWrite">是否覆蓋</param>
/// <returns>成功:true/失?。篺alse</returns>
public static bool Decompression(string strZipPath, string strUnZipPath, bool overWrite)
{
try
{
ReadOptions options = new ReadOptions();
options.Encoding = Encoding.Default;//設(shè)置編碼,解決解壓文件時中文亂碼
using (ZipFile zip = ZipFile.Read(strZipPath, options))
{
foreach (ZipEntry entry in zip)
{
if (string.IsNullOrEmpty(strUnZipPath))
{
strUnZipPath = strZipPath.Split('.').First();
}
if (overWrite)
{
entry.Extract(strUnZipPath, ExtractExistingFileAction.OverwriteSilently);//解壓文件,如果已存在就覆蓋
}
else
{
entry.Extract(strUnZipPath, ExtractExistingFileAction.DoNotOverwrite);//解壓文件,如果已存在不覆蓋
}
}
return true;
}
}
catch (Exception)
{
return false;
}
}
}
使用方法:
1.壓縮文件
List<string> list = new List<string>();
list.Add(@"D:\Test\ss");
list.Add(@"D:\Test\test1.jpg");
list.Add(@"D:\公司文件.txt");
list.Add(@"D:\Test\ss.xml");
bool isSuc =ZipUtils. CompressMulti(list, "D:\\Test2.zip",true);
2.解壓文件
bool isSuc = ZipUtils.Decompression("D:\\Test\\Test1.zip", "D:\\Teest", true);
相關(guān)文章
C#中將xml文件反序列化為實例時采用基類還是派生類的知識點討論
在本篇文章里小編給大家整理的是關(guān)于C#中將xml文件反序列化為實例時采用基類還是派生類的知識點討論,有需要的朋友們學(xué)習(xí)下。2019-11-11C#設(shè)計模式之ChainOfResponsibility職責(zé)鏈模式解決真假美猴王問題實例
這篇文章主要介紹了C#設(shè)計模式之ChainOfResponsibility職責(zé)鏈模式解決真假美猴王問題,簡單說明了責(zé)任鏈模式的概念,并結(jié)合《西游記》中真假美猴王故事背景為實例分析了責(zé)任鏈模式的具體使用技巧,需要的朋友可以參考下2017-09-09C#定制Excel界面并實現(xiàn)與數(shù)據(jù)庫交互的方法
這篇文章主要介紹了C#定制Excel界面并實現(xiàn)與數(shù)據(jù)庫交互的方法的相關(guān)資料,需要的朋友可以參考下2015-11-11