如何使用“解压缩”从ZipFile解压缩单个文件;SHFILEOPSTRUCT”;

本文关键字:解压缩 文件 SHFILEOPSTRUCT 单个 何使用 ZipFile | 更新日期: 2023-09-27 18:28:22

我知道这个问题被问了1000次,但我不想使用任何外部工具,如(DotNetZipSharpZipLib)

我目前有一个工作代码:

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"。

如何使用“解压缩”从ZipFile解压缩单个文件;SHFILEOPSTRUCT”;

.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文件中提取单个项目。在我看来,你的选择是:

  1. 包括第三方ZIP库
  2. 切换到.net 4.5并使用框架提供的ZIP库
  3. 看看System.IO.Packaging中的ZipPackage是否有足够的功能来满足您的需求
  4. 写下你自己的邮政编码
  5. 将整个ZIP文件提取到一个临时目录中,然后挑选出所需的部分

pFrom需要双空终止:

string _from = Path.Combine(apk, "*.*") + "'0'0";

这是因为它可以包含多个路径,这些路径应该以null分隔。