我想为我为asp.net网站创建的插件创建一个zip提取器。我希望客户端能够运行提取器,并将文件放入我指定的正确文件夹中。这有什么工具吗?我不知道该怎么做,谢谢
答案 0 :(得分:10)
DotNetZip是一个允许托管代码应用程序读取或写入zip文件的库。它允许您做的一件事是生成一个自解压存档(SFX)。
在C#中,使用DotNetZip生成SFX存档的代码如下所示:
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或其他zip工具(包括Windows资源管理器“压缩文件夹”)进行读取和提取。
SFX包含其他zip功能,包括
在DotNetZip中,您可以生成两种可能的SFX风格:控制台应用程序或WinForms应用程序。 WinForms UI是为您生成的 - 无需编写或设计。它简单实用,看起来像这样:
控制台风格更适合在脚本或无头(无UI)场景中使用。
生成SFX时有很多选项,例如:
可以通过DotNetZip类库接口访问SFX行为的所有选项。
如果您不喜欢内置SFX功能的UI或工作模型,可以通过简单的方法提供自己的自提取器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必须从其自身读取才能提取。在上面的示例中,my-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。为了避免这种情况,并生成一个可以在没有其他DLL依赖项的情况下提取的自包含EXE,您可以使用ILMerge或嵌入式资源中的embed the DotNetZip DLL as a resource and use an AssemblyResolver event to load it。
如果您有疑问,可以the DotNetZip forums询问。
答案 1 :(得分:2)