偶然间清理笔记本,发现了多年前的照片,然而是两个压缩包,重要的是,压缩包设置有密码,试了大约十分钟,崩溃,并不记得密码。
压缩有两个,一个zip,个rar。
网上找了找,zip的解决方案蛮多的,而解压rar并没有。
想了想,似乎可以调用7z来解决rar的问题。
用C#调用命令行才执行批量密码解压,不过似乎没法很友好的检查出那个密码对错并break
,只能进行解压。
google了一下,发现了sevenzipsharp
这个,看了看文档,参照着写了一下解压代码。调用装的最新版7z的dll报Can not load 7-zip library or internal COM error! Message: DLL file does not exist.
错误,从sevenzipsharp
下了9.15版本,这才正常。
/// <summary>
/// check zip or rar password by file path
/// </summary>
/// <param name="path"></param>
/// <param name="password"></param>
/// <returns></returns>
public bool CheckRARByPath(string path, string password)
{
SevenZipBase.SetLibraryPath(@"7z.dll");
using (SevenZipExtractor extractor = new SevenZipExtractor(path, password))
{
if (extractor.Check())
{
return true;
}
else
{
return false;
}
}
}
这样的坏处是每次都要传入path
一下,猜想如果是大文件岂不是很惨,SevenZipExtractor
有个stream
参数,用FileStream
读一下再转一下:
FileStream fs = new FileStream(@"test.rar", FileMode.Open);
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Stream stream = new MemoryStream(bytes);
这样测试下来,大文件超出了内存^_^……
既然是找回密码,就不做那么复杂了,这时候发现我的数学真是着急,组合数组干脆就用for
来循环了。
很顺利,rar跑了不到1分钟,zip跑了10分钟找回了密码。
送上源码:demo
参考资料:
github上的仓库: SevenZipSharp in github
codeplex似乎要关站了,备份了一下文档和库: