2009-10-16 8 views
3

asp.net 사이트 용으로 만든 플러그인 용 zip 추출기를 만들고 싶습니다. 클라이언트가 추출기를 실행할 수있게하고 파일을 지정한 올바른 폴더에 배치합니다. 이것을위한 도구가 있습니까? 나는zip 추출기 만들기

답변

9

DotNetZip 관리 코드 앱을 읽거나 zip 파일을 쓸 수있는 라이브러리입니다. 당신이 할 수있는 한 가지는 SFX (self-extracting archive)를 만드는 것입니다. 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는 Windows 탐색기의 "압축 폴더"를 비롯하여 WinZip 또는 다른 zip 도구로 읽고 추출 할 수있는 일반 Zip 파일이기도합니다.

는 SFX는

  • 에서 WinZip AES 암호화를 포함하여, 다른 압축 기능을 구성하는 - 그래서 당신은 일을 암호화하고 암호 만 알고 사람을 풀기 할 수 있습니다.
  • 매우 큰 아카이브의 경우 ZIP64.
  • 유니 코드, 보통 ~ ASCII 범위 밖에있는 파일 이름입니다. 콘솔 응용 프로그램 또는 윈폼 응용 프로그램 : 파일 속성, 타임 스탬프의
  • 복원 등 DotNetZip에서

, 당신이 생성 할 수있는 SFX의 두 가지 맛이있다. WinForms UI는 사용자를 위해 생성되었으므로 작성하거나 디자인 할 필요가 없습니다. 그것은 간단하고 실용적인, 그리고 다음과 같습니다

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

콘솔 맛이 스크립트에서 사용에 더 적합, 또는 헤드리스 (UI 없음) 시나리오에서.


옵션의 무리가 있습니다 같은 SFX를 생성 할 때 :

  • 무엇의 일부가 될 수 있습니다 압축을 풀고 (명령 후 실행
  • 명령을 풀고 후 탐색기를 엽니 다 여부 unpacked)
  • '실행시 압축 해제'명령이 성공적으로 완료된 후 선택적으로 모든 파일을 제거하십시오. 패치 유틸리티에 좋았습니다.
  • SFX EXE를 위해 사용하거나 사용자의 환경, 예를 들어 % USERPROFILE %을 기준으로 할 수있는 기본
  • 기본 추출물 디렉토리를 받아 기존 파일
  • 에게 Win32에서 아이콘을 덮어할지 여부를 지정합니다.
  • "조용한"모드는 콘솔 앱을 사용하는 경우 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는에서 을 읽어 추출해야합니다.

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에 대한 종속성이있을 것이다 : 위의 예에서 내-SFX-stub.exe 프로그램의 코드는 다음과 같은 간단한 수 있습니다. 이를 피하고 추가 DLL 종속성없이 추출 할 수있는 자체 독립 EXE를 생성하려면 ILMerge 또는 embed the DotNetZip DLL as a resource and use an AssemblyResolver event to load it을 임베디드 리소스에서 사용할 수 있습니다.

질문이 있으시면 the DotNetZip forums으로 문의하십시오.

+0

생성 된 SFX 파일에 NET이 필요하지 않은 도구가 있습니까? –

+0

저는 특정 도구를 모르겠습니다. 너 혼자 쓸 수있어. 스텁 (stub) - zip을 읽고 압축을 풀 수있는 실행 가능 코드를 작성해야합니다. zlib와 같은 제 3 자 lib에 의존 할 수 있습니다. sfx를 만들 때 여전히 DotNetZip을 사용할 수 있지만 Zip 콘텐츠를 스트리밍하기 전에 출력에 사용자 정의 스텁을 스트리밍 할 수 있습니다. – Cheeso

관련 문제