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

k1l*_*r8e 1 .net c# pinvoke

我知道这个问题被问过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);
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法提取/复制单个文件/文件夹。如果我*.*res\\drawable\\icon.png它替换例如,它将什么都不做。

有人可以告诉我如何使用来提取单个文件/文件夹SHFILEOPSTRUCT吗?我想念什么吗?

该代码支持:

框架版本:.Net Client 4

操作系统:WinXP,8,8.1,10

编辑(通知):

当您在C#线程中使用这段代码时,总会出现“超出路径长度”错误……在这种情况下,您需要使用“分派器”。

Mar*_*rkO 5

.NET 4.5具有本机ZIP支持,您应该尝试

using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
    foreach (ZipArchiveEntry entry in archive.Entries.Where(e => e.FullName.Containts("a")))
    {
        entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
    }
} 
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 1

SHFileOperation无法从 ZIP 文件中提取单个项目。我认为你的选择是:

  1. 包括第 3 方 ZIP 库。
  2. 切换到 .net 4.5 并使用框架提供的 ZIP 库。
  3. 看看ZipPackagefrom是否System.IO.Packaging有足够的功能来满足您的需求。
  4. 编写您自己的邮政编码。
  5. 将整个 ZIP 文件解压缩到临时目录,然后选择您需要的部分。