c#使用sevenzipsharp的操作
封装了一个类,方便使用sevenzipsharp,支持加入进度显示事件。
双重加密压缩工具范例:

using sevenzip;
using system;
using system.collections.generic;
using system.io;
using system.linq;
using system.text;
using system.threading.tasks;
namespace processitems
{
class sevenzipsharpuser
{
// 假设这是某个类中的一个事件定义
public event eventhandler<progresseventargs> progressupdated = null;
public static bool setsetlibrarypath()
{
//设置库路径
string currentdirectory = appdomain.currentdomain.basedirectory;
string dllpath = getappropriate7zdllpath(currentdirectory);
if (!file.exists(dllpath))
{
return false;
}
sevenzipsharpuser.setsetlibrarypath(dllpath);
return true;
}
public static void setsetlibrarypath(string s7zdllpath)
{
sevenzipbase.setlibrarypath(s7zdllpath);
}
public bool compressitem(string inputitem, string outputfile, string password = null)
{
string directory = path.getdirectoryname(outputfile);
if (!directory.exists(directory))
{
directory.createdirectory(directory);
}
if (directory.exists(inputitem))
{
return compressdir(inputitem, outputfile, password);
}
else if (file.exists(inputitem))
{
return compressfile(inputitem, outputfile, password);
}
return false;
}
public bool doublecompressitem(string inputitem, string outputfile, string password1 = null, string password2 = null)
{
string directory = path.getdirectoryname(outputfile);
string filenamewithoutextension = path.getfilenamewithoutextension(outputfile);
string sfirstdstpath = path.combine(directory, $"{filenamewithoutextension}{".7zx"}");
compressitem(inputitem, sfirstdstpath, password1);
compressitem(sfirstdstpath, outputfile, password2);
file.delete(sfirstdstpath);
return false;
}
public string getuniquefilepath(string filepath)
{
string directory = path.getdirectoryname(filepath);
string filenamewithoutextension = path.getfilenamewithoutextension(filepath);
string extension = path.getextension(filepath);
int counter = 1;
string newfilepath = filepath;
while (file.exists(newfilepath))
{
newfilepath = path.combine(directory, $"{filenamewithoutextension}{counter}{extension}");
counter++;
}
return newfilepath;
}
public bool compressfile(string inputfile, string outputfile, string password = null)
{
try
{
// 检查输入文件是否存在
if (!file.exists(inputfile))
{
throw new filenotfoundexception("输入文件不存在。", inputfile);
}
// 创建 sevenzipcompressor 实例
var compressor = new sevenzipcompressor();
// 设置压缩级别和档案格式
compressor.compressionlevel = compressionlevel.normal;
compressor.archiveformat = outarchiveformat.sevenzip;
// 订阅进度更新事件
if (progressupdated != null)
{
compressor.compressing += progressupdated;
}
// 压缩文件
compressor.compressfilesencrypted(outputfile, password, inputfile);
if (progressupdated != null)
{
compressor.compressing -= progressupdated;
}
// 压缩成功后返回 true
return true;
}
catch (exception ex)
{
// 在发生异常时记录日志、抛出异常或返回 false
// 这里简单地返回 false,但你可以根据需要更改此行为
console.writeline($"压缩文件时发生错误: {ex.message}");
return false;
}
finally
{
}
}
public bool compressdir(string stinputdir, string stoutputfile, string stpwd)
{
try
{
// 检查输入文件是否存在
if (!directory.exists(stinputdir))
{
throw new filenotfoundexception("输入目录不存在。", stinputdir);
}
// 创建 sevenzipcompressor 实例
var compressor = new sevenzipcompressor();
// 设置压缩级别和档案格式
compressor.compressionlevel = compressionlevel.normal;
compressor.archiveformat = outarchiveformat.sevenzip;
// 订阅进度更新事件
if (progressupdated != null)
{
compressor.compressing += progressupdated;
}
// 压缩文件
compressor.compressdirectory(stinputdir, stoutputfile, stpwd);
if (progressupdated != null)
{
compressor.compressing -= progressupdated;
}
// 压缩成功后返回 true
return true;
}
catch (exception ex)
{
// 在发生异常时记录日志、抛出异常或返回 false
// 这里简单地返回 false,但你可以根据需要更改此行为
console.writeline($"压缩文件时发生错误: {ex.message}");
return false;
}
finally
{
}
}
private static string getappropriate7zdllpath(string basepath)
{
string dllname = "7z.dll";
string dllpath = path.combine(basepath, dllname);
// check if the system is 64-bit or 32-bit
if (environment.is64bitoperatingsystem)
{
// if the system is 64-bit, check for a specific 64-bit version of the dll
string dll64path = path.combine(basepath, "7z.dll"); // example name for 64-bit version
if (file.exists(dll64path))
{
return dll64path;
}
// if the specific 64-bit version is not found, fall back to the generic name
}
else
{
// if the system is 32-bit, check for a specific 32-bit version of the dll
string dll32path = path.combine(basepath, "7-zip32.dll"); // example name for 32-bit version
if (file.exists(dll32path))
{
return dll32path;
}
// if the specific 32-bit version is not found, fall back to the generic name
}
// if neither specific version is found, return the generic dll name (which might be a universal version or an error)
return dllpath;
}
}
}使用方法:
//设置库
if (!sevenzipsharpuser.setsetlibrarypath())
{
messagebox.show("7z.dll库引用失败!", "错误!", messageboxbuttons.ok, messageboxicon.error);
}
//这里是处理任务逻辑开始========start===========
if (iteminfo.bdoublecompress)
{
szu.doublecompressitem(iteminfo.sitempath, iteminfo.sdstpath, iteminfo.spassword1, iteminfo.spassword2);
}
else
{
szu.compressitem(iteminfo.sitempath, iteminfo.sdstpath, iteminfo.spassword1);
}
//这里是处理任务逻辑结束========end=============拓展:c#使用sevenzipsharp压缩解压文件
首先程序需要用到三个dll文件,分别是:sevenzipsharp.dll、7z.dll、7z64.dll,其中sevenzipsharp.dll需要程序进行引用,而其他两个文件给代码使用,其中7z.dll是32位,7z64.dll是64位的。(此处需要注意,这里的32位与64位指的是程序,而不是操作系统,即指的是vs中右键项目属性里的目标平台,可由system.intptr.size判断,4为32位,8为64位,当时因为这里的歧义踩过坑)
解压
伪代码:
if(intptr.size == 4) //32位操作系统
{
sevenzipcompressor.setlibrarypath(appdomain.currentdomain.basedirectory + @"\7z.dll"); //路径指向dll文件,此处dll放在与程序相同目录,以下相同。
}
else //64位操作系统
{
sevenzipcompressor.setlibrarypath(appdomain.currentdomain.basedirectory + @"\7z64.dll");
}
using (var tmp = new sevenzipextractor(“压缩文件全名称”)) //这里的全名称包含路径
{
tmp.extractarchive(“解压到的路径”);
}
压缩
伪代码:
if(intptr.size == 4) //32位操作系统
{
sevenzipcompressor.setlibrarypath(appdomain.currentdomain.basedirectory + @"\7z.dll");
}
else //64位操作系统
{
sevenzipcompressor.setlibrarypath(appdomain.currentdomain.basedirectory + @"\7z64.dll");
}
var compressor = new sevenzipcompressor();
//压缩文件夹:
compressor.compressdirectory(目录名,压缩文件名称);//此处有多个重载,不一一列出。
//压缩文件:
var ziptool = new sevenzipcompressor();
ziptool.archiveformat = outarchiveformat.zip; //压缩文件类型
string[] filenames = {“文件全路径”,“文件全路径” }; //需要添加到压缩文件的文件的全路径数组。
ziptool.compressfiles(“压缩文件名称”, filenames); //传递压缩文件名称,及文件全路径数组。
以上就是c#使用sevenzipsharp实现压缩文件和目录的详细内容,更多关于c# sevenzipsharp压缩的资料请关注代码网其它相关文章!
发表评论