IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] Decompression de Fichier Zip


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 92
    Points : 48
    Points
    48
    Par défaut [VB.NET] Decompression de Fichier Zip
    bonjour,

    je recherche un exemple de code pour decompresser un fichier zip.
    j'ai vu qu'il existait un nameSpace System.IO.Compression natif au .net et je cherche donc si j'ai bien compris a utiliser la classe DeflateStream pour dezipper mon fichier.
    Pouvez vous donc me confirmer cela ?
    Avez vous un exemple de code ? meme en C#

    Merci d'avance
    Vijeo

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu as également possibilité de passer par SharZipLib:

    http://morpheus.ftp-developpez.com/sources/ZipFileDotnet/ZipFile.zip

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 92
    Points : 48
    Points
    48
    Par défaut
    Merci pour la reponse,
    mais cette classe ne me convient pas car je cherche a decompresser le fichier dans une procedure stockée de SQL 2005 et je n'ai pas trouvé la solution pour referencer cette classe alors que cela semble possible avec cette classe Deflatstream...
    Merci
    @+ Vijeo

  4. #4
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Exemple de compression/Decompression avec Gzip (C'est pareil pour Deflate). Par contre je ne sais pas si Deflate decompresse les zip

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
            Public Shared Sub Main(ByVal args As String())
                Try
                    CompressFile("Test.txt", "Test.gz")
                    Console.WriteLine("Fichier Test.txt compressé vers Test.gz")
                    DecompressFile("Test.gz", "TestDecompress.txt")
                    Console.WriteLine("Fichier Test.gz décompressé vers TestDecompress.txt")
                Catch ex As Exception
                    Console.WriteLine(String.Format("{0}: {1}", ex.[GetType](), ex.Message))
                End Try
                Console.ReadLine()
            End Sub
     
            Public Shared Sub CompressFile(ByVal NomFichierACompresser As String, ByVal NomFichierCompresse As String)
                Dim outCompressedStream As GZipStream = Nothing
                Dim inFileStream As FileStream = Nothing
                Dim outFileStream As FileStream = Nothing
                Dim inBuffer As Byte()
                Try
                    ' Ouvrir et lire le fichier à compresser
                    inFileStream = New FileStream(NomFichierACompresser, FileMode.Open, FileAccess.Read, FileShare.Read)
                    inBuffer = New Byte(Convert.ToInt32(inFileStream.Length)) {}
                    inFileStream.Read(inBuffer, 0, inBuffer.Length)
                    ' Ouverture et creation du fichier à compresser
                    outFileStream = New FileStream(NomFichierCompresse, FileMode.CreateNew, FileAccess.Write, FileShare.Read)
                    ' Ouverture du flux de compression
                    outCompressedStream = New GZipStream(outFileStream, CompressionMode.Compress)
                    ' Compression
                    outCompressedStream.Write(inBuffer, 0, inBuffer.Length)
                Finally
                    ' Fermeture des fluxs
                    If inFileStream IsNot Nothing Then
                        inFileStream.Close()
                    End If
                    If outCompressedStream IsNot Nothing Then
                        outCompressedStream.Close()
                    End If
                    If outFileStream IsNot Nothing Then
                        outFileStream.Close()
                    End If
                End Try
            End Sub
     
            Public Shared Sub DecompressFile(ByVal sArchiveFile As String, ByVal sDecompressedFile As String)
                Dim inDecompressedStream As GZipStream = Nothing
                Dim inFileStream As FileStream = Nothing
                Dim outFileStream As FileStream = Nothing
                Dim inBuffer As Byte()
                Dim iInBufferDataLength As Integer
                Dim fiArchiveFile As FileInfo
                Try
                    ' Ouverture du fichier à decompresser
                    inFileStream = New FileStream(sArchiveFile, FileMode.Open, FileAccess.Read, FileShare.Read)
                    ' Creation du flux de decompression
                    inDecompressedStream = New GZipStream(inFileStream, CompressionMode.Decompress)
                    ' 
                    fiArchiveFile = New FileInfo(sArchiveFile)
                    inBuffer = New Byte(Convert.ToInt32(fiArchiveFile.Length) * 20) {}
                    ' La decompression se fait en lisant le flux GzipStream
                    ' On utilise  cette fonction maison car Stream.Length n'est
                    ' pas disponible pour GzipStream. A la sortie de cette fonction, inBuffer
                    ' contient les données non compressées
                    iInBufferDataLength = ReadAllBytesFromStream(inDecompressedStream, inBuffer)
                    ' Creation du fichier decompressé
                    outFileStream = New FileStream(sDecompressedFile, FileMode.CreateNew, FileAccess.Write, FileShare.Read)
                    outFileStream.Write(inBuffer, 0, iInBufferDataLength)
                Finally
                    ' Fermeture flux ouvers
                    If inFileStream IsNot Nothing Then
                        inFileStream.Close()
                    End If
                    If inDecompressedStream IsNot Nothing Then
                        inDecompressedStream.Close()
                    End If
                    If outFileStream IsNot Nothing Then
                        outFileStream.Close()
                    End If
                End Try
            End Sub
     
            Private Shared Function ReadAllBytesFromStream(ByVal stream As GZipStream, ByRef buffer As Byte()) As Integer
                Dim iOffset As Integer = 0
                Dim iTotalBytesRead As Integer = 0
                Dim iBytesRead As Integer = 0
                ' Le buffer doit au moins avoir 4ko en taille
                If buffer.Length < 4096 Then
                    Array.Resize(Of Byte)(buffer, 4096)
                End If
                ' La decompression se fait en lisant le flux GzipStream
                ' On utilise  cette fonction maison car Stream.Length n'est
                ' pas disponible pour GzipStream
                While True
                    iBytesRead = stream.Read(buffer, iOffset, 4096)
                    If iBytesRead = 0 Then
                        Exit While
                    End If
                    iOffset += iBytesRead
                    iTotalBytesRead += iBytesRead
                    If buffer.Length < (iOffset + 4096) Then
                        Array.Resize(Of Byte)(buffer, 2 * buffer.Length)
                    End If
                End While
                Return iTotalBytesRead
            End Function

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 92
    Points : 48
    Points
    48
    Par défaut
    Merci ce code marche tres bien
    je me suis donc epressé de le modifier et la badaboum ça ne marche plus pour des fichiers ZIP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Public Shared Sub DecompressFileZip(ByVal sArchiveFile As String, ByVal sDecompressedFile As String)
            Dim inDecompressedStream As DeflateStream = Nothing
            Dim inFileStream As FileStream = Nothing
            Dim outFileStream As FileStream = Nothing
            Dim inBuffer As Byte()
            Dim iInBufferDataLength As Integer
            Dim fiArchiveFile As FileInfo
            Try
                ' Ouverture du fichier à decompresser 
                inFileStream = New FileStream(sArchiveFile, FileMode.Open, FileAccess.Read, FileShare.Read)
                ' Creation du flux de decompression 
                inDecompressedStream = New DeflateStream(inFileStream, CompressionMode.Decompress)
                ' 
                fiArchiveFile = New FileInfo(sArchiveFile)
                inBuffer = New Byte(Convert.ToInt32(fiArchiveFile.Length) * 20) {}
                ' La decompression se fait en lisant le flux GzipStream 
                ' On utilise  cette fonction maison car Stream.Length n'est 
                ' pas disponible pour GzipStream. A la sortie de cette fonction, inBuffer 
                ' contient les données non compressées 
                iInBufferDataLength = ReadAllBytesFromStreamzip(inDecompressedStream, inBuffer)
                ' Creation du fichier decompressé 
                outFileStream = New FileStream(sDecompressedFile, FileMode.CreateNew, FileAccess.Write, FileShare.Read)
                outFileStream.Write(inBuffer, 0, iInBufferDataLength)
            Finally
                ' Fermeture flux ouvers 
                If inFileStream IsNot Nothing Then
                    inFileStream.Close()
                End If
                If inDecompressedStream IsNot Nothing Then
                    inDecompressedStream.Close()
                End If
                If outFileStream IsNot Nothing Then
                    outFileStream.Close()
                End If
            End Try
        End Sub
     
        Private Shared Function ReadAllBytesFromStreamzip(ByVal stream As DeflateStream, ByRef buffer As Byte()) As Integer
            Dim iOffset As Integer = 0
            Dim iTotalBytesRead As Integer = 0
            Dim iBytesRead As Integer = 0
            ' Le buffer doit au moins avoir 4ko en taille 
            If buffer.Length < 4096 Then
                Array.Resize(Of Byte)(buffer, 4096)
            End If
            ' La decompression se fait en lisant le flux GzipStream 
            ' On utilise  cette fonction maison car Stream.Length n'est 
            ' pas disponible pour GzipStream 
            While True
                iBytesRead = stream.Read(buffer, iOffset, 4096)
                If iBytesRead = 0 Then
                    Exit While
                End If
                iOffset += iBytesRead
                iTotalBytesRead += iBytesRead
                If buffer.Length < (iOffset + 4096) Then
                    Array.Resize(Of Byte)(buffer, 2 * buffer.Length)
                End If
            End While
            Return iTotalBytesRead
        End Function
    ça trappe sur la ligne suivante

    iBytesRead = stream.Read(buffer, iOffset, 4096)

    Avec le message suivant
    "Block length does not match with its complement."

    je suis donc un peu trop novice pour debugger cette erreur avez vous une idée ?
    @+ Vijeo

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    C'est ce que j'ai dit plus haut. Je ne pense pas que le Deflate natif de .NET 2.0 décompresse et compresse au format zip. C'est à dire essayer de decommpresser des fichiers .zip avec ne fonctionnera pas. De m^me que, compresser des fichier en les nommant .zip, ils ne pourront être ouverts par winzip

    Par contre le GzipStream compresse au format Gzip (gz) qui est lisible par Winzip.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 92
    Points : 48
    Points
    48
    Par défaut
    Et le GzipStream il ne saurait par hazard dezipper des fichiers zip ??
    Merci
    Vijeo

  8. #8
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par vijeo
    Et le GzipStream il ne saurait par hazard dezipper des fichiers zip ??
    Merci
    Vijeo
    Non. Juste les gz (Winzip/winrar savent lire les gz). Pour les zip, il faut faire une classe dérivée de DeflateStream ou bien utiliser la librairie proposée par Morpheus

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Points : 58
    Points
    58
    Par défaut
    je remonte ce topic, car je cherche aussi à obtenir un fichier au format ZIP avec la classe DeflateStream.

    si quelqu'un a des infos la dessus merci.

  10. #10
    gph
    gph est déconnecté
    Membre habitué Avatar de gph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 99
    Points : 134
    Points
    134
    Par défaut
    Je suis moi aussi à la recherche d'une solution native !

    Cela me parait curieux que le ZIP soit intégré dans les système d'exploitation (XP et Vista) et que l'on ai pas le moyen de le manipuler avec .NET

    Microsoft se mettant à remettre en cause des formats qu'ils utilisents massivement pour utiliser du GZip ... curieux !

Discussions similaires

  1. Java.util.zip : decompresser un fichier zip
    Par kam81 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 22/07/2007, 12h45
  2. [C#] [1.1] Decompression de fichier zip
    Par petitchat dans le forum Windows Forms
    Réponses: 1
    Dernier message: 14/11/2006, 15h27
  3. Decompresser des fichiers *.zip
    Par alex_95 dans le forum Général VBA
    Réponses: 4
    Dernier message: 07/07/2006, 14h37
  4. Decompresser un fichier .zip en command prompt cmd
    Par dighou dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 11h36
  5. Decompresser un fichier .zip
    Par dighou dans le forum MFC
    Réponses: 2
    Dernier message: 23/06/2005, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo