Como escrever minha própria classe zip em .net

votos
1

Eu queria usar .net do System.IO.Compression.GZipStream para compactar e descompactar um diretório. Mas acho que é só é capaz de comprimir um único arquivo, como eu posso escrever uma classe zip que pode comprimir um diretório específico em um arquivo zip?

ps: não estamos autorizados a usar qualquer biblioteca zip terceiros

Publicado 27/08/2009 em 04:48
fonte usuário
Em outras línguas...                            


5 respostas

votos
4

Você deve tar os arquivos primeiro.

EDITAR

Se você estiver se sentindo aventureiro por que você não projetar seu próprio cabeçalho e escrever cada arquivo zipado sequencialmente. Armazenar todos os nomes de arquivo no cabeçalho e o índice de onde começar.

Respondeu 27/08/2009 em 04:51
fonte usuário

votos
3

Há uma abundância de documentação sobre o formato de arquivo .zip. Wikipedia é um bom lugar para começar: http://en.wikipedia.org/wiki/ZIP_file_format .

Você pode usar o System.IO.Compression.DeflateStreampara a compressão real, mas você vai precisar de uma implementação CRC32, e você vai precisar para o layout do arquivo com os cabeçalhos corretos, etc.

É um não-trivial quantidade de trabalho.

Você pode considerar a compra de uma biblioteca .zip comercial, se você é incapaz de usar uma biblioteca de código aberto. Você não deve ter quaisquer problemas legais com o uso de uma biblioteca comercial **, e o custo para adquirir uma licença é quase certamente mais barato do que o custo de desenvolver e testar a biblioteca si mesmo. Além disso, verifique ao redor. Sua empresa pode ter uma licença para já uma biblioteca comercial.

** Eu não sou advogado, portanto verifique com seu contato legal.

Respondeu 27/08/2009 em 06:17
fonte usuário

votos
2

Se você estiver em 3.0+, você pode usar System.IO.Packaging para criar arquivos zip.

Respondeu 27/08/2009 em 05:27
fonte usuário

votos
1

Você tem poucas opções

1. Use Shell.Application
Você pode ligar para o Shell. Em VBScript, parece que isso:

dim sa
set sa = CreateObject("Shell.Application")

Dim zip
Set zip = sa.NameSpace(pathToZipFile)

Dim d
Set d = sa.NameSpace(dirToZip)


For Each s In d.items
    WScript.Echo  s
Next


' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx
' ===============================================================
' 2nd arg is a bit field: 
' 4 = do not display a progress box
' 16 = Respond with "Yes to All" for any dialog box that is displayed.
' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified. 
' 256 = Display a progress dialog box but do not show the file names.
' 2048 = Version 4.71. Do not copy the security attributes of the file.
' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories.

WScript.Echo "copying files..."

zip.CopyHere d.items, 4

' CopyHere is asynchronous. Gotta wait til it's done. 
sLoop = 0
Do Until d.Items.Count <= zip.Items.Count
    Wscript.Sleep(1000)
Loop

Eu não sei se isso é acessível a partir de código gerenciado, mas eu acho que sim. Ela se sente tipo de hacky para mim embora.

Além disso, você precisa para pré-inicializar o arquivo zip antes de adicionar coisas a ele:

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim file
Set file = fso.CreateTextFile(pathToZipFile)

file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0)

file.Close
Set fso = Nothing
Set file = Nothing

2. Implementar-lo sozinho
Se você não quiser usar Shell.Application, em teoria, você pode criar sua própria implementação da classe zip sem muita dificuldade, especialmente se você tiver requisitos limitados. O formato zip não é super complicado, se você não implementar criptografia, Zip64, Unicode, timestamps de alta resolução, streaming e assim por diante ...

3. Faça a revisão legal e Re-Use
Ao invés de gastar tempo de engenharia desenvolvimento de uma nova aplicação, investigar as implementações que estão lá fora agora. Algumas pessoas se preocupam com a GPL com SharpZipLib. DotNetZip é liberado sob a licença pública Microsoft, muito permissiva e não termos virais.

Respondeu 27/08/2009 em 06:54
fonte usuário

votos
1

Usar classes System.IO.Directory e System.IO.File para enumerar todos os arquivos e pastas, faça-o de forma recursiva para garantir que você obtenha arquivo em subpastas. Depois de ter todos os arquivos zip-los um de cada vez (ou usar um pool de threads) e você deve ter o que você precisa.

Respondeu 27/08/2009 em 04:52
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more