none
ICSharpCode.SharpZipLib Zip corrompu ou mauvais format RRS feed

  • Question

  • Bonjour,

    J'ai développé un service Windows (VS 2010) pour gérer une série de processus (flux fichiers, Sauvegardes, MAJ Base, Génération de PDF, manipulations de fichiers SMG/3DVia, ...).

    La partie "manipulations de fichiers SMG/3DXML" me pose problème.

    J'utilise ICSharpCode.SharpZipLib.Zip pour compresser 2 fichiers SMG et 3DXML.

    En fait, ces fichiers sont eux mêmes des fichiers compressés. Si (avant traitement) je renomme manuellement le SMG en zip, je peux voir son contenu.

    Mon outil les compresse ensemble. Par la suite, lorsqu'ils sont à nouveau extrait, le SMG n'a plus un format valide (testé avec le unzip de windows et 7-Zip.


    FB

    samedi 7 juillet 2012 14:52

Réponses

  • Désolé de mon retard, le problème était aléatoire finalement

    En générant d'autre fichier SMG, j'ai constaté que tout allait bien...

    J'ai fini par utiliser 7-Zip en créant des scripts bat dynamiquement.


    FB

    jeudi 26 juillet 2012 12:24

Toutes les réponses

  • Voici la classe qui manipule la compression/decompression de fichiers :

    Imports System
    Imports System.IO
    Imports ICSharpCode.SharpZipLib.Zip
    Imports ICSharpCode.SharpZipLib.Checksums
    Public Class zip
        Public Class ZipExtract
            ''' <summary>Extracts the specified zip file with its directory hierarchy</summary>
            ''' <param name="SourceFileName">Zip file to be extracted</param>
            ''' <param name="DestinationFolderName">New folder that the zip will be extracted into</param>
            ''' <param name="DeleteZip">Delete or keep the original zip after extracting</param>
            Public Shared Sub Extract(ByVal SourceFileName As String, _
                                      ByVal DestinationFolderName As String, _
                                      Optional ByVal DeleteZip As Boolean = False)
                Try
                    Using ZIS As New ZipInputStream(File.OpenRead(SourceFileName))
                        Dim ZE As ZipEntry = ZIS.GetNextEntry()
                        While Not IsNothing(ZE)
                            Dim strDirectoryName As String = Path.GetDirectoryName(ZE.Name)
                            Dim strFileName As String = Path.GetFileName(ZE.Name)
                            'Check for any folder existency in the zip folder
                            If strDirectoryName.Length > 0 Then
                                Directory.CreateDirectory(DestinationFolderName & "\" & strDirectoryName)
                            End If
                            If strFileName <> [String].Empty Then
                                Using FS As FileStream = File.Create(DestinationFolderName & "\" & ZE.Name)
                                    Dim i As Integer = 2048
                                    Dim b As Byte() = New Byte(2048) {}
                                    While True
                                        i = ZIS.Read(b, 0, b.Length)
                                        If i > 0 Then
                                            FS.Write(b, 0, i)
                                        Else
                                            Exit While
                                        End If
                                    End While
                                End Using
                            End If
                            ZE = ZIS.GetNextEntry()
                        End While
                    End Using
                Catch ex As Exception
                    Throw ex
                End Try
                'Delete the original zip file after extracting it
                If DeleteZip = True Then
                    File.Delete(SourceFileName)
                End If
            End Sub
        End Class
        Public Class ZipCompress
            ''' <summary>
            ''' Zip files in directory to sZipFileName
            ''' </summary>
            Public Shared Sub zipFiles(ByVal sSourceDir As String, ByVal sZipFileName As String, ByVal SearchPattern As String)
                Dim astrFileNames() As String = Directory.GetFiles(sSourceDir.ToString, SearchPattern)
                Dim objCrc32 As New Crc32
                Dim strmZipOutputStream As ZipOutputStream
                Dim objZipEntry As ZipEntry
                Try
                    strmZipOutputStream = New ZipOutputStream(File.Create(sZipFileName.ToString))
                    strmZipOutputStream.SetLevel(6)
                    REM Compression Level: 0-9
                    REM 0: no(Compression)
                    REM 9: maximum compression
                    Dim strFile As String
                    For Each strFile In astrFileNames
                        Dim strmFile As FileStream = File.OpenRead(strFile)
                        Dim abyBuffer(CType(strmFile.Length - 1, Integer)) As Byte
                        strmFile.Read(abyBuffer, 0, abyBuffer.Length)
                        objZipEntry = New ZipEntry(Path.GetFileName(strFile))
                        objZipEntry.DateTime = DateTime.Now
                        objZipEntry.Size = strmFile.Length
                        strmFile.Close()
                        objCrc32.Reset()
                        objCrc32.Update(abyBuffer)
                        objZipEntry.Crc = objCrc32.Value
                        strmZipOutputStream.PutNextEntry(objZipEntry)
                        strmZipOutputStream.Write(abyBuffer, 0, abyBuffer.Length)
                    Next
                    strmZipOutputStream.Finish()
                    strmZipOutputStream.Close()
                Catch ex As Exception
                    Throw
                End Try
            End Sub
        End Class
    End Class


    FB

    samedi 7 juillet 2012 15:04
  • La commande compressant les 2 fichier SMG et 3DXML est :

    zip.ZipCompress.zipFiles(RepertoireSMG_PUT_TMP_IN, RepertoireSMG_PUT_TMP_OUT & "\" & NomSMG & ".zip", NomSMG & ".*")

    FB

    samedi 7 juillet 2012 15:07
  • Le problème semble venir que cette classe ne marche pas avec des fichiers déjà compressés.

    Je vais essayer d'utiliser 7-zip en ligne de commande avec System.Diagnostics.Process


    FB

    samedi 7 juillet 2012 21:02
  • J'ai fais le test, ca fonctionne très bien !

    Peut être est-ce un pb avec vos noms de dossiers et de sous-dossier. Je vous conseille d'utiliser les méthodes de Path pour créer des noms de fichiers et des noms de répertoires plutôt que de la faire par concaténation.

    Par exemple :

    If strDirectoryName.Length > 0 Then
                            Directory.CreateDirectory(Path.Combine(destinationFolderName, strDirectoryName)
                    End If
                    If strFileName <> [String].Empty Then
                        Using fs As FileStream = File.Create(Path.Combine(destinationFolderName, ze.Name))


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 9 juillet 2012 07:42
  • Je n'ai pas encore trouver l'origine du problème mais en effet, la classe gérant les zip fonctionne.

    L'origine vient peut être des fichiers d'origine. Lorsque j'essaie de visualiser le contenu des SMG (provenant de 3dvia composer), avec l'outil de decompression interne de Windows, il retourne une erreur comme quoi ce n'est pas une archive.

    3dvia composer spécifie que les SMG sont au format zip, mais je commence à en douter.


    FB

    lundi 9 juillet 2012 09:48
  • Bonjour,

    avez vous pu trouver l'origine du problème? Merci de tenir la communauté informée de la suite de vos recherches.

    Cordialement

    jeudi 26 juillet 2012 12:18
    Modérateur
  • Désolé de mon retard, le problème était aléatoire finalement

    En générant d'autre fichier SMG, j'ai constaté que tout allait bien...

    J'ai fini par utiliser 7-Zip en créant des scripts bat dynamiquement.


    FB

    jeudi 26 juillet 2012 12:24