前言:sevenzipsharp检查密码(包括检查压缩包的有效性)的函数是SevenZipExtractor.check(), sevenzipsharp调用的是7zip的动态链接库,而且不止是7zip,其它压缩软件测试密码这个功能耗时也很久(压缩包小可以忽略,密码错误的时候速度还行,密码正确的话,会把压缩包全部解压,耗时相当于解压一个文件的时间),除了360压缩比较快,至少快几百倍,但是找不到调用的方法,如果谁有更好的解决方案,麻烦提供一下。

原来的check方法4G大小的文件大概耗时

错误的密码:www.cr173.com用时:0.19秒
正确的密码:www.he11oworld.com用时:85.98秒

方案1:我的思路是既然检测一个压缩包的解压密码,没必要把所有的文件都检测一遍,取压缩包最小的加密文件去检测就行了,4G大小的文件大概耗时

错误的密码:www.cr173.com用时:0.19秒
正确的密码:www.he11oworld.com用时:26.18秒

方案2:同样是检查一个文件,检查第一个加密文件,,4G大小的文件大概耗时

错误的密码:www.cr173.com用时:0.12秒
正确的密码:www.he11oworld.com用时:0.10秒

发现方案二是最优的,一下是具体实现的代码

定义一个全局字段,用来存取压缩包内最小的文件索引和大小

private IDictionary<int, ulong> encryptionFileInfo = null;

初始化窗体时实例化

encryptionFileInfo = new Dictionary<int, ulong>();

获取压缩包信息时,保存最小文件的索引和大小

encryptionFileInfo.Clear();
foreach (ArchiveFileInfo item in extr.ArchiveFileData)
{
if (item.Encrypted)
{
if (encryptionFileInfo.Count == )
{
encryptionFileInfo.Add(item.Index, item.Size);
}
////只检测最小文件的实现方法
//else
//{
// if (encryptionFileInfo.Values.ElementAt(0) > item.Size)
// {
// encryptionFileInfo.Clear();
// encryptionFileInfo.Add(item.Index, item.Size);
// }
//}
}
}

实现优化函数,在SevenZipExtractor.cs单元添加函数如下函数

/// <summary>
/// 检查压缩包密码
/// </summary>
/// <param name="minFileIndex">压缩包中加密文件索引最小的值</param>
/// <returns></returns>
public bool Check(int minFileIndex)
{
DisposedCheck();
try
{
InitArchiveFileData(false);
var archiveStream = GetArchiveStream(true);
var openCallback = GetArchiveOpenCallback();
if (!OpenArchive(archiveStream, openCallback))
{
return false;
}
using (var aec = GetArchiveExtractCallback("", (int)_filesCount, null))
{
try
{
uint[] u = new uint[];
u[] = uint.Parse(minFileIndex.ToString());
CheckedExecute(
_archive.Extract(u, , , aec),
SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec);
//CheckedExecute(
// _archive.Extract(null, UInt32.MaxValue, 1, aec),
// SevenZipExtractionFailedException.DEFAULT_MESSAGE, aec);
}
finally
{
FreeArchiveExtractCallback(aec);
}
}
}
catch (Exception)
{
return false;
}
finally
{
if (_archive != null)
{
_archive.Close();
}
((InStreamWrapper)_archiveStream).Dispose();
_archiveStream = null;
_opened = false;
}
return true;
}

之后就是调用了,

using (SevenZipExtractor extr = new SevenZipExtractor(tbPackagePath.Text, Convert.ToString(item["Password"])))
{ if (extr.Check(index))
{
tbPassword.Text = Convert.ToString(item["Password"]);
memoEdit1.Text = memoEdit1.Text + "此为正确密码:" + Convert.ToString(item["Password"]) + "用时:" + (DateTime.Now - dtStartDetail).TotalMilliseconds.ToString() + "\r\n";
return;
}
memoEdit1.Text = memoEdit1.Text + "测试密码:" + Convert.ToString(item["Password"]) + "用时:" + (DateTime.Now - dtStartDetail).TotalMilliseconds.ToString() + "\r\n";
}

如果只用方案2可以把IDictionary<int, ulong>换成整型

提高sevenzipsharp 检查密码的速度(1)的更多相关文章

  1. 处理sevenzipsharp 检查密码函数的Bug

    using (SevenZipExtractor extr = new SevenZipExtractor(tbPackagePath.Text, "www.pc6.com")) ...

  2. 通过预编译头文件来提高C++ Builder的编译速度

    C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...

  3. AD帐户操作C#示例代码(二)——检查密码将过期的用户

    本文接着和大家分享AD帐户操作,这次开发一个简单的检查密码将过期用户的小工具. 首先,新建一个用户实体类,属性是我们要取的用户信息. public class UserInfo { /// <s ...

  4. 检查密码复杂度的C#正则表达式

    在用户注册与修改.重置密码时,强制密码达到一定的复杂度,是减少盗号的有效措施之一. 而在代码中检查密码复杂度就需要用到正则表达式,比如要求密码必须包含数字.小写或大写字母.特殊字符.字符数在8-30之 ...

  5. 如何提高Lucene构建索引的速度

    如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...

  6. 提高NetBeans的代码提示速度.md

    NetBeans配置 如何提高NetBeans的代码提示速度,打开下面的文件然后配置 **C:\Users\ylg\AppData\Roaming\NetBeans\8.2\config\Editor ...

  7. PAT 1081 检查密码(15) (代码+思路)

    1081 检查密码(15 分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也 ...

  8. nginx提高加载静态文件速度

    1.本来对于静态网页,我们不需要放在应用容器中,原因一时由于应用服务器是用来解析动态网页的,针对静态网页本来就性能不高,而且还会占用应用容器的资源,所以我们专门使用nginx用来解析静态网页.     ...

  9. B1081 检查密码 (15分)

    B1081 检查密码 (15分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母 ...

随机推荐

  1. Linux系统挂载数据盘

    参考:http://help.aliyun.com/knowledge_detail/5974154.html?spm=5176.788314850.3.2.hUqwXo 1.在阿里云上购买了服务器, ...

  2. 【转】MySQL数据丢失讨论

    原文http://blog.sae.sina.com.cn/archives/4091 1.   概述 很多企业选择 MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么 ...

  3. NET映射导致的应用无法访问

    应用环境 IIS 数据库  oracle11G 服务器 windwos2003 企业版 周一早上刚到,听到业务部门的人反应,集团的扫码抢系统登陆不上了,没办法进行出入库操作,大批货物在仓库堆积,承运车 ...

  4. mysql数据库常规命令操作

    1.MySQL数据库导出命令 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名     mysqldump -u wcnc -p smgp_apps_wcn ...

  5. FTP地址格式如下:“ftp://用户名:密码@FTP服务器IP”

    FTP地址格式如下:“ftp://用户名:密码@FTP服务器IP”

  6. Windows MFC 两个OpenGL窗口显示与线程RC问题

    问题为:背景界面是一个OpenGL窗口(对话框),在其上弹出一个OpenGL窗口(模态对话框)时, 1.上方的OpenGL窗口能响应鼠标操作等并刷新: 2.当移动或放大缩小上方的OpenGL窗口时,其 ...

  7. Openlayers简介

    OpenLayers 是由MetaCarta公司开发的,用于WebGIS客户端的 JavaScript包,目前的最高版本是2.5 V,通过BSD License 发行.它实现访问地理空间数据的方法都符 ...

  8. TableViewCell,TableView,UITableViewCell

    这次的学习是在Navigation-based Application模板中,用RootViewController class设置操作方法,使用UITableView的属性值.在导航控制器控件为程序 ...

  9. 英语学习app分析

    以下数据分析由队员张波收集整理队员链接 队友的博客 一.数据统计 为了让统计数据更加准确可信,我们选取了三款android平台的应用市场软件作为数据的来源. 英语学习app下载量统计表: 序号 应用名 ...

  10. PgSQL dump 工具

    #!/bin/bash #Auther Sun Ying ##Copy left ##Version: Demo Version ##Basic Compare the datebase change ...