Comment écrire ma propre classe zip en .net

voix
1

Je voulais utiliser System.IO.Compression.GZipStream de .net pour compresser et décompresser un répertoire. Mais je trouve qu'il est seulement capable de compresser un seul fichier, comment puis-je écrire une classe zip qui peut compresser un répertoire spécifique à un fichier zip?

ps: nous ne sommes pas autorisés à utiliser une bibliothèque zip tiers

Créé 27/08/2009 à 04:48
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
4

Vous devez d'abord les fichiers TAR.

MODIFIER

Si vous vous sentez aventureux pourquoi concevez-vous pas votre propre tête et d'écrire chaque fichier compressé de façon séquentielle. Conservez tous les noms de fichiers dans l'en-tête et l'indice de l'endroit où ils commencent.

Créé 27/08/2009 à 04:51
source utilisateur

voix
1

Utilisez les classes System.IO.Directory et System.IO.File d'énumérer tous les fichiers et les dossiers, faire récursive pour vous assurer d'obtenir le fichier dans les sous-dossiers. Une fois que vous avez tous les fichiers zip les un à la fois (ou utilisez un threadpool) et vous devriez avoir ce que vous avez besoin.

Créé 27/08/2009 à 04:52
source utilisateur

voix
2

Si vous êtes sur 3.0+, vous pouvez utiliser System.IO.Packaging pour créer des fichiers zip.

Créé 27/08/2009 à 05:27
source utilisateur

voix
3

Il y a beaucoup de documentation sur le format de fichier .zip. Wikipedia est un bon endroit pour commencer: http://en.wikipedia.org/wiki/ZIP_file_format .

Vous pouvez utiliser le System.IO.Compression.DeflateStreampour la compression réelle, mais vous aurez besoin d' une mise en œuvre de CRC32, et vous aurez besoin de la mise en page du fichier avec les en- têtes corrects, etc.

Il est un non-trivial quantité de travail.

Vous pouvez envisager l'achat d'une bibliothèque commerciale si vous .zip ne pouvez pas utiliser une bibliothèque open source. Vous ne devriez pas avoir des problèmes juridiques avec l'aide d'une bibliothèque commerciale **, et le coût d'achat d'une licence est presque certainement moins cher que le coût de développement et de tester la bibliothèque vous. En outre, vérifiez autour. Votre entreprise peut avoir une licence pour une bibliothèque commerciale déjà.

** Je ne suis pas un avocat, afin de vérifier avec votre interlocuteur juridique.

Créé 27/08/2009 à 06:17
source utilisateur

voix
1

vous avez quelques options

1. Utilisez Shell.Application
Vous pouvez appeler à Shell. Dans VBScript , il ressemble à ceci:

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

Je ne sais pas si cela est accessible à partir du code managé, mais je pense que oui. Il se sent en quelque sorte hacky pour moi cependant.

, Vous devez également effectuer une pré-initialiser le fichier zip avant d'ajouter des choses à lui:

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. Mettre en œuvre vous - même
si vous ne voulez pas utiliser Shell.Application, en théorie , vous pouvez créer votre propre implémentation de classe zip sans trop de difficultés, surtout si vous avez des exigences limitées. Le format zip est pas super compliqué, si vous n'implémenter le cryptage, Zip64, Unicode, horodatages haute résolution, le streaming, et ainsi de suite ...

3. Est - ce que l'examen juridique, et les utiliser
plutôt que de passer du temps de développement d' une nouvelle technique mise en œuvre, les implémentations qui enquêter sont là - bas maintenant. Certaines personnes s'inquiètent de la GPL avec SharpZipLib. DotNetZip est publié sous la licence publique Microsoft, très permissive et pas de termes viraux.

Créé 27/08/2009 à 06:54
source utilisateur

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