2014-10-29 61 views
1

我知道這個問題被問到1000次但我不想使用任何外部工具,如(DotNetZipSharpZipLib)。如何使用「SHFILEOPSTRUCT」從ZipFile解壓縮單個文件?

我有這個當前工作一段代碼:

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提取單個文件/文件夾嗎?我想念什麼?

代碼支持:

Framework版本:.NET客戶端4

OS:WinXP中,8,8.1,10

EDIT(通知):

當使用此片的代碼在C#線程中總是會得到'Path length exceeded'錯誤......在這種情況下,您需要使用'Dispatcher'。

+1

您的目標.Net框架是什麼? – 2014-10-29 15:11:46

+0

我使用.NET客戶端4.(只是添加到我的問題) – k1ll3r8e 2014-10-29 15:19:03

+1

請注意,根據MSDN [這裏](http://msdn.microsoft.com/en-us/library/windows/desktop/bb759795%28v= vs.85%29.aspx),你應該使用[IFileOperation](http://msdn.microsoft.com/en-us/library/windows/desktop/bb775771%28v=vs.85%29.aspx)從Vista起 – 2014-10-29 15:19:36

回答

1

SHFileOperation無法從ZIP文件中提取單個項目。您看到的選項有:

  1. 包含第三方ZIP庫。
  2. 切換到.net 4.5並使用框架提供的ZIP庫。
  3. 看看ZipPackage來自System.IO.Packaging有足夠的功能來滿足您的需求。
  4. 寫下自己的郵政編碼。
  5. 將整個ZIP文件解壓縮到一個臨時目錄,然後挑選出需要的部分。
+0

嘿,那裏,我們的信息! - 但是,我不能做1-3步,所以我決定(昨天)將完整的zip解壓到tmp文件夾並手動移動所需的文件/文件夾。 - 關於自制的拉鍊包裝這是我的下一個項目。 ;) - 但是,很多THX給你這個真正有用的提示! – k1ll3r8e 2014-10-30 15:35:10

4

.NET 4.5有native ZIP support,你應該嘗試

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)); 
    } 
} 
+0

Thx爲示例代碼,但我無法切換到更高的框架版本。因爲我使用這個代碼在我的dll中使用了很多ppl ...所以他們也必須設置更高版本的.NET。 – k1ll3r8e 2014-10-29 15:16:49

1

pFrom中必須是雙空值終止:

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

這是因爲它可以包含多個路徑,這應該是空 - 分隔。

+0

THX的提示,但它仍然工作。它仍然想要提取單個項目。 – k1ll3r8e 2014-10-29 15:29:10

+1

我之前的示例中存在語法錯誤(單引號與雙引號)。假設你發現了這一點,你可以添加你在嘗試時得到的確切的錯誤嗎? – 2014-10-29 15:36:07

+0

嘿:) - 尤普斯我見過這個小問題 - NP。 - 這是一個有趣的問題...我得到一個錯誤...它只是無所事事。 – k1ll3r8e 2014-10-29 15:45:46