2009-10-16 18 views
3

我想爲我爲asp.net網站創建的插件創建一個zip提取器。我希望客戶端能夠運行提取器,並將文件放入我指定的正確文件夾中。有沒有這方面的工具?我不知道如何做到這一點,得益於創建一個zip提取器

回答

9

DotNetZip是一個庫,允許託管代碼的應用程序來讀取或寫入zip文件。它允許你做的一件事是產生一個自解壓檔案(SFX)。

在C#中,產生具有DotNetZip一個自解壓文件的代碼如下所示:

using (ZipFile zip1 = new ZipFile()) 
{ 
    // zip up a directory 
    zip1.AddDirectory("C:\\project1\\datafiles", "data"); 
    zip1.Comment = "This will be embedded into a self-extracting exe"; 
    zip1.AddEntry("Readme.txt", "This is content for a 'Readme' file that will appear in the zip."); 
    zip1.SaveSelfExtractor("archive.exe", SelfExtractorFlavor.WinFormsApplication); 
} 

您選擇如何塑造ZIP文件的文件夾層次。唯一的規則是,在提取時,提取發生在特定的根文件夾或父文件夾中。 (不能提取到分散在文件系統中的7個不同目錄)

生成的EXE需要.NET Framework 2.0或更高版本才能運行,但沒有別的。

SFX/EXE也是一個普通的Zip文件,可以使用WinZip或其他壓縮工具(包括Windows資源管理器「壓縮文件夾」)進行讀取和提取。

的SFX組成與其他壓縮功能,包括

  • 的WinZip AES加密 - 這樣你就可以加密的東西,只允許開箱的人誰知道密碼。
  • ZIP64非常大的檔案。
  • Unicode,用於正常〜ASCII範圍之外的文件名。
  • 恢復的文件屬性,時間戳等

在DotNetZip,有SFX的兩種可能的口味,你可以生成:一個控制檯應用程序或WinForms應用程序。 WinForms UI爲您生成 - 無需編寫或設計。它的簡單和實用,而且看起來是這樣的:

alt text http://i36.tinypic.com/4q1pc4.jpg

控制檯味道更適合在腳本中使用,或在無頭(無UI)的場景。


有一堆選項生產SFX,就像當:

  • 是否拆包
  • 命令解壓(命令後執行可能的什麼部分後打開資源管理器解壓縮後)
  • 可選擇在「解包執行」命令成功完成後刪除所有文件。很好的修補工具。
  • 是否覆蓋現有文件
  • Win32的圖標來使用的SFX EXE,或只接受默認
  • 默認解壓目錄,它可以根據用戶的環境,比如%USERPROFILE%。
  • 「安靜」模式,這意味着它運行時,它提供或者沒有UI可言,如果你如果使用的WinForms味道使用一個控制檯應用程序,或者只是一個簡單的進度條。沒有按鈕可以點擊 - 這個SFX只是自動解包。

所有這些SFX行爲的選項都可以通過DotNetZip類庫接口訪問。


如果你不喜歡的UI或工作模式內置SFX能力,有一個簡單的方法來提供自己的自解壓UI +邏輯。例如,你可以在WPF中構建一個應用程序,並使其成爲時髦和可視化的。它的工作方式非常簡單:在生成SFX的代碼中,將解壓縮存根EXE(WinForms,WPF或其他)複製到輸出流中,然後在不關閉流的情況下將Zip文件保存到同一個流中。它在VB中看起來像這樣:

Public Shared Function Main(ByVal args As String()) As Integer 
    Dim sfxStub As String = "my-sfx-stub.exe" 
    Dim outputFile As String = "my-sfx-archive.exe" 
    Dim directoryToZip As String = "c:\directory\to\ZIP" 
    Dim buffer As Byte() = New Byte(4000){} 
    Dim n As Integer = 1 
    Using output As System.IO.Stream = File.Open(outputFile, FileMode.Create) 
     '' copy the contents of the sfx stub to the output stream 
     Using input As System.IO.Stream = File.Open(sfxStub, FileMode.Open) 
      While n <> 0 
       n = input.Read(buffer, 0, buffer.Length) 
       If n <> 0 Then 
        output.Write(buffer, 0, n) 
       End If 
      End While 
     End Using 
     '' now save the zip file to the same stream 
     Using zp As New ZipFile 
      zp.AddFiles(Directory.GetFiles(directoryToZip), False, "") 
      zp.Save(output) 
     End Using 
    End Using 
End Function 

該代碼創建的結果文件既是EXE文件也是ZIP文件。存根EXE必須從自身中讀取以提取。在上面的例子中,對於我,SFX-stub.exe程序代碼可能是這樣簡單的東西:

Dim a As Assembly = Assembly.GetExecutingAssembly 
Try 
    '' read myself as a zip file 
    Using zip As ZipFile = ZipFile.Read(a.Location) 
     Dim entry As ZipEntry 
     For Each entry in zip 
      '' extract here, or add to a listBox, etc. 
      '' listBox1.Items.Add(entry.FileName) 
     Next 
    End Using 
Catch 
    MessageBox.Show("-No embedded zip file.-") 
End Try 

在這個簡單的方式構建一個定製的SFX會對DotNetZip DLL的依賴。爲了避免這種情況,並且生成一個獨立的EXE,它可以在沒有附加的DLL依賴關係的情況下進行提取,您可以使用ILMerge或嵌入式資源中的embed the DotNetZip DLL as a resource and use an AssemblyResolver event to load it

如果你有問題,你可以問上the DotNetZip forums

+0

您是否知道任何對製作的SFX文件不需要_not_工具的工具? – 2010-12-24 13:31:49

+0

我不知道具體的工具。你可以自己寫一個。您需要編寫存根 - 讀取zip並將其解壓縮的可執行代碼。你可以依靠像zlib這樣的第三方庫來做到這一點。在您創建sfx時,您仍然可以使用DotNetZip,但在傳輸zip內容之前,將自己的自定義存根串流到輸出中。 – Cheeso 2010-12-24 13:39:11