我想爲我爲asp.net網站創建的插件創建一個zip提取器。我希望客戶端能夠運行提取器,並將文件放入我指定的正確文件夾中。有沒有這方面的工具?我不知道如何做到這一點,得益於創建一個zip提取器
回答
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。
- 1. PHP - 提取一個zip
- 2. 創建Zip文件在Windows和提取Zip文件在Linux中
- 3. 2 CSV上創建一個ZIP
- 4. 如何使用ZipPackage創建一個zip
- 5. 使用PHP創建一個zip文件
- 6. 在C++中創建一個zip存檔
- 7. 創建一個ZIP文件腳本不會創建ZIP(無錯誤)
- 8. 將zip條目提取到另一個Zip文件
- 9. 從ZIP提取文件直接到另一個ZIP
- 10. 從目錄讀取文件創建一個ZIP hadoop
- 11. 從另一個zip文件重新創建zip文件
- 12. 從zip文件中提取時重新創建目錄結構
- 13. 提取ZIP在Java
- 14. 一個簡單的腳本來提取一個zip文件
- 15. 如何添加一個txt文件,並創建一個PHP ZIP
- 16. 創建一個推特機器人 - 需要幫助提取一個字符串
- 17. 一次提取zip文件一個文件
- 18. 創建zip文件時使用gulp-vinyl-zip創建TypeError
- 19. PHP創建zip但排除zip文件
- 20. Powershell在最後一個zip文件上失敗時提取zip文件。
- 21. 如何從兩個.doc文件創建一個.zip文件?
- 22. 從多個文件創建zip文件
- 23. 由crontab提取Zip文件
- 24. 從zip中提取文件
- 25. 提取.zip文件在python
- 26. Windows API提取zip文件?
- 27. Nodejs從ZIP提取文件
- 28. C中的7-zip提取#
- 29. PHP提取zip文件上
- 30. 提取zip默認覆蓋?
您是否知道任何對製作的SFX文件不需要_not_工具的工具? – 2010-12-24 13:31:49
我不知道具體的工具。你可以自己寫一個。您需要編寫存根 - 讀取zip並將其解壓縮的可執行代碼。你可以依靠像zlib這樣的第三方庫來做到這一點。在您創建sfx時,您仍然可以使用DotNetZip,但在傳輸zip內容之前,將自己的自定義存根串流到輸出中。 – Cheeso 2010-12-24 13:39:11