2015-07-21 98 views
1

我正在使用c#fw4.5。 我有一個簡單的代碼解壓zip文件。c#提取目錄下的zip文件

foreach(ZipArchiveEntry entry in z.entries) //z is a zip file open in ZipArchiveMode.Read 
{ 
     entry.ExtractToFile(entry.FullName); 
} 

zip文件裏面有一個目錄,所有文件都在該目錄內。 當我看到z.Entries時,我看到它的一個數組,其中[0]只是目錄,[1],[2],[3]是文件。 但是當它嘗試做:

entry.ExtractToFile(entry.FullName);

在第一個條目上,出現錯誤: 「文件名,目錄名稱或卷標語法不正確」。

我似乎無法找出最新的錯誤。我是否也需要任何東西來打開目錄?也許因爲條目是一個目錄只有「ExtractToFile(entry.FullName)」不能工作?

謝謝先進。

+0

當你運行它時,entry.FullName的值是什麼?我的猜測是它是一個invliad絕對路徑,或者它展開到一個無效的相對路徑。根據ZipArchiveEntry.ExtractToFile()的文檔,「允許路徑指定相對或絕對路徑信息,相對路徑信息被解釋爲相對於當前工作目錄。」 – Taegost

回答

1

根據this MSDN articleExtractToFile方法需要一個文件路徑(帶有擴展名),並且如果指定了目錄,將會拋出一個ArgumentException

由於存檔中的第一個條目是一個目錄,並且您將其名稱用作參數,因此您有此問題。

查找到相關ExtractToDirectory方法,它是用來像這樣:

ZipFile.ExtractToDirectory(@"c:\zip\archive.zip", @"c:\extract\"); 
-1

更換你的路:

void Main() 
{ 
    var zipPath = @"\\ai-vmdc1\RedirectedFolders\jlambert\Downloads\cscie33chap1and2.zip"; 
    var extractPath = @"c:\Temp\extract"; 

    using (ZipArchive z = ZipFile.OpenRead(zipPath)) 
    { 
     foreach(ZipArchiveEntry entry in z.Entries) //z is a zip file open in ZipArchiveMode.Read 
     { 
      entry.ExtractToFile(Path.Combine(extractPath, entry.FullName), true); 
     } 
    } 
} 
0

除了Tonkleton的答案,我會建議你使用第三方壓縮庫,因爲ZipArchive在.Net 4.5框架之前不支持框架版本,所以我可以建議DotNetZip,正如其他有關StackOverflow早期框架壓縮的問題所述。

+0

當他說:「我正在使用c#fw4.5。」時,這與此有關嗎?如果你這麼想,請告訴我們。 – jacoblambert

+1

如果您不想使用便攜式代碼,則不相關。 – gh0st

+0

很酷 - 謝謝。 – jacoblambert