如何使用“解压缩”从ZipFile解压缩单个文件;SHFILEOPSTRUCT”;
本文关键字:解压缩 文件 SHFILEOPSTRUCT 单个 何使用 ZipFile | 更新日期: 2023-09-27 18:28:22
我知道这个问题被问了1000次,但我不想使用任何外部工具,如(DotNetZip或SharpZipLib)
我目前有一个工作代码:
string _from = Path.Combine(apk, "*.*") + ''0';
string _to = destination + ''0' + Path.Combine(destination, "*.*") + ''0';
NativeMethods.SHFILEOPSTRUCT fileop = new NativeMethods.SHFILEOPSTRUCT();
fileop.pFrom = _from;
fileop.pTo = _to;
fileop.wFunc = NativeMethods.FO_Type.FO_COPY;
fileop.fFlags = NativeMethods.FOF_Flag.FOF_WANTNUKEWARNING;
NativeMethods.SHFileOperation(ref fileop);
我的问题是无法提取/复制单个文件/文件夹。例如,如果我用res''drawable''icon.png
替换*.*
,它将不会起任何作用。
有人能告诉我如何使用SHFILEOPSTRUCT
提取单个文件/文件夹吗?我错过什么了吗?
代码支持:
框架版本:.Net Client 4
操作系统:WinXP,8,8.1,10
EDIT(注意事项):
当你在C#线程中使用这段代码时,你总是会收到一个"超过路径长度"的错误。。。在这种情况下,您需要使用"Dispatcher"。
.NET4.5具有本地ZIP支持,您应该尝试
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries.Where(e => e.FullName.Contains("a")))
{
entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
}
}
SHFileOperation
无法从ZIP文件中提取单个项目。在我看来,你的选择是:
- 包括第三方ZIP库
- 切换到.net 4.5并使用框架提供的ZIP库
- 看看
System.IO.Packaging
中的ZipPackage
是否有足够的功能来满足您的需求 - 写下你自己的邮政编码
- 将整个ZIP文件提取到一个临时目录中,然后挑选出所需的部分
pFrom需要双空终止:
string _from = Path.Combine(apk, "*.*") + "'0'0";
这是因为它可以包含多个路径,这些路径应该以null分隔。