2016-09-01 68 views
0

正如標題所示,我試圖在zip中創建一個zip文件。使用ZipArchive類在C#中創建歸檔文件夾

我有一個變量來創建一個zip壓縮文件名爲「TargetFilePath」

var projectDirectoryPath = currentProjectViewModel.DirectoryPath; 
ZipFile.CreateFromDirectory(projectDirectoryPath, [email protected]"/Project.zip"); 

以上都不行,我假設,因爲路徑C:\ test.zip \ project.zip不是有效路徑。

編輯爲了清楚起見:我從字面上想要壓縮一些文件並將該壓縮文件放入另一個壓縮文件中。它必須使用System.IO.Compression,而不是第三方方法。

從我的理解,你必須創建一個目標地址爲zip文件,並且,也是從我的經驗,目標地址不能是無效的路徑,如「C:\ test.zip \ project.zip」

+0

遞歸調用也許? –

+1

如果'projectDirectoryPath'有一個.zip文件+其中的任何其他文件,那麼它應該工作。如果您已經有一個.zip文件,並且想要將zip文件添加到該文件中,那麼[this](https://msdn.microsoft.com/zh-cn/library/hh158346(v = vs.110).aspx )是做到這一點的一種方式,但對我來說這看起來很痛苦。我只會努力工作,首先創建內部zip文件,然後將其壓縮,而不是創建outter zip並將其他文件添加到其中。有關其他選項,請參閱[此處](https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v = vs.110).aspx)的備註。 – Quantic

+1

或者,將現有壓縮文件解壓縮到一個目錄中,將其他壓縮文件複製到該目錄中,然後使用您擁有的相同命令壓縮該文件夾。我這樣說是因爲[ZipArchive.CreateEntry](https://msdn.microsoft.com/en-us/library/hh158346(v = vs.110).aspx)看起來很笨拙,你不能只是「添加這個文件到壓縮文件「,您必須以某種方式將文件流式傳輸到該文件中。如果你有這些資源,那麼只需使用一些IO,一段時間讓生活更輕鬆,IMO。 – Quantic

回答

2

最簡單的方法是在您的projectDirectoryPath的內容的臨時文件中創建您的壓縮文件,一旦完成,您將該文件添加到您的目標zip壓縮文件。

所以基本上是這樣的:

var projectDirectoryPath = currentProjectViewModel.DirectoryPath; 
var tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 
try 
{ 
    ZipFile.CreateFromDirectory(projectDirectoryPath, tempFile); 

    using (var archive = ZipFile.Open(TargetFilePath, ZipArchiveMode.Update)) 
    { 
     archive.CreateEntryFromFile(tempFile, "Project.zip", CompressionLevel.NoCompression); 
    } 
} 
finally 
{ 
    System.IO.File.Delete(tempFile); 
} 

我建議你使用CompressionLevel.NoCompression因爲zip壓縮包已經被壓縮和壓縮的另一層將沒有價值添加到它。在打開存檔時使用ZipArchiveMode.Update非常重要,因此實際上zip文件已被更改。此枚舉器的其他值用於從頭開始創建新的存檔或以只讀方式打開它。

在這個例子中我使用了CreateEntryFromFile函數。這是一種擴展方法,因此請確保您在using聲明中具有名稱空間。

可以通過某種方式實現此目的,因此不需要臨時文件,但需要更多的代碼,因爲您必須自己創建新的zip文件並將其直接寫入創建achive中的新條目。但是在大多數情況下,我給出的例子應該可以完成這項工作

+0

當我使用這種方法時,我得到一個例外,即臨時文件已經存在 –

+0

修正了這個問題。現在它使用一個非常安全的方法來生成臨時文件。如果文件名已被使用,這可能仍然失敗。如果你想確保這個工作正常,你必須循環,直到你得到一個免費的文件名並檢查文件是否已被使用。 – Nitram

+0

http://pastebin.com/HyEdu0Sm此代碼仍然創建相同的錯誤。我能夠檢查變量的值,並且「fileExists」確實返回false,所以我會假設這會起作用 –