.net 创建zip提取器

.net 创建zip提取器,.net,asp.net,zip,.net,Asp.net,Zip,我想为我为asp.net网站创建的插件创建一个zip提取器。我希望客户端能够运行提取器,并将文件放入我指定的正确文件夹中。这有什么工具吗?我不知道该怎么做,谢谢。请看:是一个允许托管代码应用程序读取或写入zip文件的库。它允许您做的一件事是生成自解压归档(SFX) 在C#中,使用DotNetZip生成SFX存档的代码如下所示: using (ZipFile zip1 = new ZipFile()) { // zip up a directory zip1.AddDirector

我想为我为asp.net网站创建的插件创建一个zip提取器。我希望客户端能够运行提取器,并将文件放入我指定的正确文件夹中。这有什么工具吗?我不知道该怎么做,谢谢。请看:

是一个允许托管代码应用程序读取或写入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功能组合,包括

  • WinZip AES加密-因此,您可以加密的东西,只允许解包的人谁知道密码
  • ZIP64用于非常大的档案
  • Unicode,用于超出正常~ASCII范围的文件名
  • 恢复文件属性、时间戳等
在DotNetZip中,您可以生成两种可能的SFX:控制台应用程序或WinForms应用程序。WinForms UI是为您生成的-无需编写或设计。它简单实用,如下所示:

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);
}

控制台风格更适合在脚本或无头(无UI)场景中使用


生产SFX时有一系列选项,如:

  • 解包后是否打开资源管理器
  • 解包后要执行的命令(该命令可以是解包内容的一部分)
  • (可选)在“解压缩时执行”命令成功完成后删除所有文件。很好的补丁工具
  • 是否覆盖现有文件
  • 用于SFX EXE的Win32图标,或仅接受默认值
  • 默认提取目录,可以基于用户的环境,例如%USERPROFILE%
  • “安静”模式,这意味着当它运行时,如果您使用的是控制台应用程序,它或者根本不提供UI,或者如果使用WinForms flavor,它只提供一个简单的进度条。没有可单击的按钮-此SFX只是自动解压缩
所有这些关于SFX行为的选项都可以通过DotNetZip类库接口访问


如果您不喜欢内置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
以这种简单方式构造的自定义SFX将依赖于DotNetZip DLL。为了避免这种情况,并生成一个独立的EXE,该EXE无需额外的DLL依赖项即可提取,您可以使用ILMerge,或从嵌入的资源中提取


如果你有问题,可以继续提问

您知道生产的SFX文件不需要.NET的任何工具吗?我不知道具体的工具。你可以自己写一本。您需要编写存根——读取zip并将其解压的可执行代码。您可以依靠第三方lib(如zlib)来实现这一点。在创建sfx时,您仍然可以使用DotNetZip,但是在流式传输zip内容之前,将您自己的自定义存根流式传输到输出中。