如何检查文件是不是通过 7zip 受密码保护?
Posted
技术标签:
【中文标题】如何检查文件是不是通过 7zip 受密码保护?【英文标题】:How do i check if a file is password protected via 7zip?如何检查文件是否通过 7zip 受密码保护? 【发布时间】:2012-01-10 04:46:01 【问题描述】:我正在使用 7zip(命令行)查看 zip/rar/7z 文件。我基本上检查了有多少文件以及它有什么扩展名。比...我得到密码保护的文件。当整个文件受密码保护时(因此您无法查看文件名或其中的任何内容)我知道。但是,如果我可以看到该文件,我无法判断它们是否受密码保护。我压缩了两个文件,一个没有密码。 7z l filename.zip 显示两个 zip 中的文件相同
如何使用 7zip 检测存档中的文件是否受密码保护?
【问题讨论】:
冒犯超级用户,因为这明确说明了使用 7zip 方法。 (似乎与编程不太相关。) 我添加了c#
标记,因为您的回答表明您实际上想在 C# 中以编程方式执行此操作。
@GregHewgill。是的。我不介意用 C++ 或者 python 我只是碰巧首先使用 C#/.NET。最初我尝试使用标准输出,但似乎我无法从标准输出/CLI 获取该数据
【参考方案1】:
对于 .7z 存档 - 使用垃圾密码进行测试时,如果存在密码,则会设置非零错误级别。
7z t -pxoxoxoxoxoxoxo archive.7z >nul 2>nul
if errorlevel 1 echo Password exists
【讨论】:
难道不能有其他原因导致非零错误级别吗?这似乎不会告诉您密码是否存在。【参考方案2】:static bool IsPasswordProtected(string filename)
string _7z = @"C:\Program Files\7-Zip\7z.exe";
bool result = false;
using (Process p = new Process())
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.FileName = _7z;
p.StartInfo.Arguments = $"l -slt \"filename\"";
p.Start();
string stdout = p.StandardOutput.ReadToEnd();
string stderr = p.StandardError.ReadToEnd();
p.WaitForExit();
if (stdout.Contains("Encrypted = +"))
result = true;
return result;
【讨论】:
【参考方案3】:使用sevenzipsharp。它没有真正记录在案,但不难弄清楚。
SevenZipExtractor.SetLibraryPath(@"path\7-Zip\7z.dll");
using (var extractor = new SevenZipExtractor(fn1))
if(extractor.Check()) //is not password protected
【讨论】:
这不是一个好的测试。如果存档损坏,在这种情况下也会显示此错误。此外,如果我们在多卷存档中选择非第一卷,在这种情况下也会抛出此问题。 @ShashankJain:我没有其他答案,所以我标记了这个。此外,这可能会给我一个误报,但出于我的需要,我不需要它提供的误报以上是关于如何检查文件是不是通过 7zip 受密码保护?的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 InputStream 7Z 存档文件是不是受密码保护?
在 Powershell 中查找受密码保护的 .ZIP 文件