下面给大家介绍c#使用icsharpcode.sharpziplib.dll进行文件的压缩与解压功能,具体代码如下所示:
using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.io;
using icsharpcode.sharpziplib.zip;
using icsharpcode.sharpziplib.checksums;
using system.security.cryptography;
namespace zip压缩与解压
{
public class ziphelper
{
/// <summary>
/// 压缩单个文件
/// </summary>
/// <param name="filetozip">需压缩的文件名</param>
/// <param name="zipfile">压缩后的文件名(文件名都是绝对路径)</param>
/// <param name="level">压缩等级(0-9)</param>
/// <param name="password">压缩密码(解压是需要的密码)</param>
public static void zipfile( string filetozip, string zipfile, int level = 5, string password = "123" )
{
if (!file.exists(filetozip))
throw new filenotfoundexception( "压缩文件" + filetozip + "不存在" );
using (filestream fs = file.openread(filetozip))
{
fs.position = 0; //设置流的起始位置
byte [] buffer = new byte [( int )fs.length];
fs.read(buffer, 0, buffer.length); //读取的时候设置position,写入的时候不需要设置
fs.close();
using (filestream zfstram = file.create(zipfile))
{
using (zipoutputstream zipstream = new zipoutputstream(zfstram))
{
zipstream.password = md5(password); //设置属性的时候在putnextentry函数之前
zipstream.setlevel(level);
string filename = filetozip.substring(filetozip.lastindexof( '\\' ) + 1);
zipentry entry = new zipentry(filename);
zipstream.putnextentry(entry);
zipstream.write(buffer, 0, buffer.length);
}
}
}
}
/// <summary>
/// 压缩多个文件目录
/// </summary>
/// <param name="dirname">需要压缩的目录</param>
/// <param name="zipfile">压缩后的文件名</param>
/// <param name="level">压缩等级</param>
/// <param name="password">密码</param>
public static void zipdir( string dirname, string zipfile, int level = 5, string password = "123" )
{
zipoutputstream zos = new zipoutputstream(file.create(zipfile));
zos.password = md5(password);
zos.setlevel(level);
addzipentry(dirname, zos, dirname);
zos.finish();
zos.close();
}
/// <summary>
/// 往压缩文件里面添加entry
/// </summary>
/// <param name="pathstr">文件路径</param>
/// <param name="zos">zipoutputstream</param>
/// <param name="basedirname">基础目录</param>
private static void addzipentry( string pathstr, zipoutputstream zos, string basedirname)
{
directoryinfo dir = new directoryinfo(pathstr);
foreach (filesysteminfo item in dir.getfilesysteminfos())
{
if ((item.attributes & fileattributes.directory) == fileattributes.directory) //如果是文件夹继续递归
{
addzipentry(item.fullname, zos, basedirname);
}
else
{
fileinfo f_item = (fileinfo)item;
using (filestream fs = f_item.openread())
{
byte [] buffer = new byte [( int )fs.length];
fs.position = 0;
fs.read(buffer, 0, buffer.length);
fs.close();
zipentry z_entry = new zipentry(item.fullname.replace(basedirname, "" ));
zos.putnextentry(z_entry);
zos.write(buffer, 0, buffer.length);
}
}
}
}
/// <summary>
/// 解压多个文件目录
/// </summary>
/// <param name="zfile">压缩文件绝对路径</param>
/// <param name="dirname">解压文件目录</param>
/// <param name="password">密码</param>
public static void unzip( string zfile, string dirname, string password)
{
if (!directory.exists(dirname)) directory.createdirectory(dirname);
using (zipinputstream zis = new zipinputstream(file.openread(zfile)))
{
zis.password = md5(password);
zipentry entry;
while ((entry = zis.getnextentry()) != null )
{
var strarr = entry.name.split( '\\' ); //这边判断压缩文件里面是否存在目录,存在的话先创建目录后继续解压
if (strarr.length > 2)
directory.createdirectory(dirname + @"\" + strarr[1]);
using (filestream dir_fs = file.create(dirname + entry.name))
{
int size = 1024 * 2;
byte [] buffer = new byte [size];
while ( true )
{
size = zis.read(buffer, 0, buffer.length);
if (size > 0)
dir_fs.write(buffer, 0, size);
else
break ;
}
}
}
}
}
private static string md5( string pwd)
{
var res = "" ;
md5 md = md5.create();
byte [] s = md.computehash(encoding. default .getbytes(pwd));
for ( int i = 0; i < s.length; i++)
res = res + s[i].tostring( "x" );
return res;
}
}
}
调用函数如下:
static void main( string [] args)
{
var str = @"\学籍导入模板.xls" ;
//var arr=str.split('\\');
var filepath = @"d:\程序文件\vs2010学习\studyprogram\zip压缩与解压\file\学籍导入模板.xls" ;
//ziphelper.zipfile(filepath, @"d:\程序文件\vs2010学习\studyprogram\zip压缩与解压\file\test.zip", 6, "123");
var dirpath = @"d:\程序文件\vs2010学习\studyprogram\zip压缩与解压" ;
//ziphelper.zipdir(dirpath + @"\file", dirpath + @"\file.zip", 6, "huage");
ziphelper.unzip(dirpath + @"\file.zip" , dirpath + @"\test" , "huage" );
console.readkey();
}
效果图如下:
总结
以上所述是小编给大家介绍的c#使用icsharpcode.sharpziplib.dll进行文件的压缩与解压功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.cnblogs.com/huage-1234/archive/2017/12/27/8127479.html
dy("nrwz");
查看更多关于C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能的详细内容...