none
Comment décompresser un fichier archive ZIP ?

    Question

  • Bonjour,

    Je cherche comment décompresser un fichier ZIP, ce dernier contenant uniquement un fichier CSV, donc : faire pondre le csv au zip.

    Il y a moult exemples, surtout en pas français... ou un peu cabalistique pour moi, je cherche à le faire à l'aide du code si possible, sans exe ou autre bestioles additive.

    Merci de vos lumières, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire



    • Modifié EhJoe mercredi 24 octobre 2012 06:20
    mardi 23 octobre 2012 18:47

Réponses

  • Bonsoir Joseph,

    Voici le code complet pour ne plus faire d'amalgame (^_^) :

    Imports System.IO
    Imports System.Net
    Imports Ionic.Zip
    
    Module Module1
        Dim fdjHttp As WebClient
        Sub Main()
            Try
                'DL du zip, le conserver en mémoire
                fdjHttp = New WebClient()
                'je voulais faire un DL async mais je n'arrive plus à déclarer l'event handles en VB lol, je suis trop C#
                'donc utilisation synchrone
                Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri("https://media.fdj.fr/generated/game/loto/nouveau_loto.zip"))
                'reprise du buffer zipBytes
    
                Using _zip As ZipFile = ZipFile.Read(New MemoryStream(zipBytes))
                    For Each entry As ZipEntry In _zip
                        'Tu peux extraire dans un autre buffer pour le parse directement dans ton application sans créer de fichier
                        Dim csvFile As FileStream = File.OpenWrite(entry.FileName)
                        entry.Extract(csvFile)
                        csvFile.Close()
                        'entry.Extract(".\" + entry.FileName)
                    Next
                End Using
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
    
        End Sub
    End Module
     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine jeudi 25 octobre 2012 22:01
    • Marqué comme réponse EhJoe vendredi 26 octobre 2012 07:36
    jeudi 25 octobre 2012 21:53
  • Bonjoàur Lyamine,

    T'es un chef, ça marche aux petit oignons !

     Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Dim erreur As String = ""
        Try
          Dim fdjHttp As System.Net.WebClient
          fdjHttp = New System.Net.WebClient()
          Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri(leLien))
          Using _zip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(New System.IO.MemoryStream(zipBytes))
            For Each entry As Ionic.Zip.ZipEntry In _zip
              Dim csvFile As System.IO.FileStream = System.IO.File.OpenWrite(entry.FileName)
              entry.Extract(csvFile)
              csvFile.Close()
            Next
          End Using
        Catch ex As Exception
          Select Case Mid(Err.Description, 1, 14)
            Case "Le nom distant" : erreur = "ERREUR  404  :  Défaut de connexion internet"
            Case "URI non valide" : erreur = "ERREUR  5  :  Lien du loto non invalide"
          End Select
          MsgBox(erreur, vbCritical)
          Exit Sub
        End Try
    End Sub

    Merci infiniment, question résolue grâce à toi.

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse EhJoe vendredi 26 octobre 2012 07:36
    vendredi 26 octobre 2012 07:35

Toutes les réponses

  • Bonjour Joseph,

    Alors il y a le namespace System.IO.Compression mais malheureusement il ne supporte pas le zip :( mais après recherche il y a System.IO.Packaging en ajoutant le référence windowsbase.dll.

    Voici un petit tuto (en anglais) :

    http://www.codeproject.com/Articles/28107/Zip-Files-Easy

    Si tu n'es pas à l'aise ou que tu as des soucis n'hésite pas à revenir ;)

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    mercredi 24 octobre 2012 13:33
  • Bonjour Lyamine,

    Ça ne fonctionne pas totalement, mais merci de ta réponse :

    Voici le code, la suite après :

        Try
          Dim fichierZIP As String = My.Application.Info.DirectoryPath & "\nouveau_loto.zip"
          Dim fichierCSV As String = My.Application.Info.DirectoryPath & "\nouveau_loto.csv"
    
          'Open the zip file if it exists, else create a new one 
          Dim zip As System.IO.Packaging.Package = System.IO.Packaging.ZipPackage.Open(fichierCSV, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)
    
          'Replace spaces with an underscore (_) 
          Dim uriFileName As String = fichierZIP.Replace(" ", "_")
    
          'A Uri always starts with a forward slash "/" 
          Dim zipUri As String = String.Concat("/", IO.Path.GetFileName(uriFileName))
    
          Dim partUri As New Uri(zipUri, UriKind.Relative)
          Dim contentType As String = Net.Mime.MediaTypeNames.Application.Zip
    
          'The PackagePart contains the information: 
          ' Where to extract the file when it's extracted (partUri) 
          ' The type of content stream (MIME type) - (contentType) 
          ' The type of compression to use (CompressionOption.Normal) 
          Dim pkgPart As System.IO.Packaging.PackagePart = zip.CreatePart(partUri, contentType, System.IO.Packaging.CompressionOption.Normal)
    
          'Read all of the bytes from the file to add to the zip file 
          Dim bites As Byte() = System.IO.File.ReadAllBytes(fichierZIP)
    
          'Compress and write the bytes to the zip file 
          pkgPart.GetStream().Write(bites, 0, bites.Length)
    
          zip.Close() 'Close the zip file
        Catch ex As Exception
          MsgBox(Err.Number & " : " & Err.Description)
        End Try
    


    Hélas ça donne ceci en visu bloc-note :

    PK    P£XA°¢G“‡  a‡    nouveau_loto.zip ¢ (                       úðPK    ‘¡XAÉW*¼ß†  Ž`    nouveau_loto.csvu½MÓnÉm$¶÷¯xöì7TU@}ųrسp„Ç‹qxÍàH=²Æ3¤¢%ù÷™À9…º‰"ÙM^Þ·N€‰¿üõ¯¿ÿþç¿þÛÿý¿ýù~ÿó¿þÓùÇß¿ÿõoÿöGúÛøË¿þþ?øÛÿò·?þþ¿ýÛ¿üÓßþúýÏû·ÿöûŸkü{‹—øwïßøIÿÿå¯ÿû÷ïÿößÿó?ýõ/ÿô/ûëŸÿñ/ÿø׿üÕ~ãßÿúç¿ýñüþç¿ÿãoÿô/ÿbÿÙ÷¯öëþàŒ_õç¿üÛŸÿøË_ÿ±~ÿøË?ÿóßþø×?ÿÃóü»¿¶ýúkÛ¿ÿkå×_+ÿþ¯Õ_­þû¿¶ÿúkû¿ÿkǯ¿v<§÷_ÿöÿüþÇ?ÛÉÿá÷ÿ÷Ÿþå÷ïÿÔJmµÍïÿþýÿëÿöù|¾­ý]-‡ÿ˜Ùâ/×·õoÓoÕ¯Öo·ÿiöÿý§­­êßÿhcëã7±_#Åþ¦ü¶¿­–)ýÛí?•YÅ~û=?köO©ãûû¿ýñX2¾ÿçÿüÿLù¶r,)¯%Bj…1nIýqcD%öÃKß:³ŸÙç·¶¶~³ÿÉRí`)Û3H¿Ó~¥Ѿý#µ|†ölPÿþÇÿðŸþ—ÿd&}ë|
    Â_†AįÀÈoûmjù©òS÷O+?ÒþÔhýð6j+¿oõ»Æ´ŸÜF‘õ…e¢[ðÂù˜•ÕÎú;>}˧êÌæèùRµsúkÎü6ÁñÈþª~×wþØ5ù‘ý£ú§Ecì•Ñ÷oó«»|gŏ­kÚO²Ï¬e–j–ô¯”1ì¿·ßóÓfûÔQ²%r¾T•c‰¼–Ø×Q;›¯}w;^ûf?uüH·ô£ûOö÷ffáÿ¹QÝ~T›ã7³Apªà`zíö
    †ýeŸߦ}×g¬õ±•Íié;‹SÏÅ1Ì™¸ÛþE`Ž}%³HæŸäùJujÛøWk©}°::>rû;qöÿvmìÔf‘BsZÝûºÙœz¾SY¯9øËçoÞ坙¸6Â5íÎØÇŠkcg¯u4|;žÍÞk·RÝ<šŽ‹]÷h©Ÿ±¯7UΗ*ãØ2Îë¶òµ¯o\ûR0£ðÎL~©ž?þÔMŠ]ŸÖìéàd`ßCy2vFÒ¶(öÂ󃲓|?T9÷¦HþPvsánÏÇþƒÇ×Üáúú» f¿áA6;{Úösg›ºø´›ÊÆÓ–Ï*í³KË–¬ôê±¤f_c×Øþ´—Ù~ŸŸ¶éf
    <Íxí°b¶¨Ú‰˜K33†™QÕ¾½.|{îKèòdÎOÙù!Õ™\Þþ»²ã›ì¿«5þÒŽ`áû˜ŸÁ—²'m.fý´ŠÏãÇTì½Úz™žŠ‹+CÍWN¼óÑÍ×пh•Òí7ýîOoó3J¾·vöï×iã3^c¦}Ímá¯Çba ýèøÓN·N¯Ì5ñœðuZ«¿Á]òo([Í–n·YÆ(W¸|–",\gÔS€Òc–³
    

    Y a comme un problème de transcription ?

    Alors je te passe la main, au plaisir, cordialent :o)



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    mercredi 24 octobre 2012 18:29
  • Ah c'est pas sur les tirages du loto de la française des jeux sur une année ?

    j'avais travaillé dessus à une époque. Si tel est le cas voici le code fonctionnel complet, sinon adapte le à tes besoins ;)

    Alors effectivement leur système Zip Package ne marche pas... donc je me suis rabattu sur Ionic.Zip (DotNetZip) ICI.

    Télécharge le puis ajoute la référence au projet qui ce trouve dans le répertoire \zip-v1.9\Release.

    Ensuite voici le code d'utilisation :

    Imports System.IO
    Imports System.Net
    Imports Ionic.Zip
    
    Module Module1
        Dim fdjHttp As WebClient
        Sub Main()
            Try
                'DL du zip, le conserver en mémoire
                fdjHttp = New WebClient()
                'je voulais faire un DL async mais je n'arrive plus à déclarer l'event handles en VB lol, je suis trop C#
                'donc utilisation synchrone
                Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri("https://media.fdj.fr/generated/game/loto/nouveau_loto.zip"))
                'reprise du buffer zipBytes
    
                Using _zip As ZipFile = ZipFile.Read(New MemoryStream(zipBytes))
                    For Each entry As ZipEntry In _zip
                        'Tu peux extraire dans un autre buffer pour le parse directement dans ton application sans créer de fichier
                        entry.Extract(".\" + entry.FileName)
                    Next
                End Using
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
    
        End Sub
    End Module

    J'ai mis un commentaire concernant l'extraction. Si tu as besoin d'aide sur cette partie, fait moi signe.

    Pour info, ce que tu vois c'est le binaire du zip avec les 2er octets qui indique le type de compression (ZIP,GZIP,FLATE,DEFLATE et j'en passe) + des infos que je me souvient plus + le nombre d'octets compressé + le nom du fichier compressé mais il y a tout ce qu'il faut sur les wiki. Mais l'essentiel c'est qu'il existe des framework qui s'occupent de tout ^^.

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !




    • Modifié Lyamine mercredi 24 octobre 2012 22:42
    mercredi 24 octobre 2012 22:34
  • Bonjour Lyamine,

    Ça marche pas mais ça devrait à la longue... Merci toujours...

    Voici le code retapé (pour moi), que je comprenne, la suite après :

    Dim fdjHttp As System.Net.WebClient
        Try
          fdjHttp = New System.Net.WebClient()
          Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri("https://media.fdj.fr/generated/game/loto/nouveau_loto.zip"))
          Using _zip As ZipFile = ZipFile.Read(New MemoryStream(zipBytes))
            For Each entry As ZipEntry In _zip
              entry.Extract(".\" + entry.FileName)
            Next
          End Using
        Catch ex As Exception
          MsgBox("ERREUR  " & Err.Number & " : " & Err.Description, vbExclamation)
        End Try

    Alors oui, c'est pour le Loto qui vient encore de changer deux ans plus tard, désormais y a 6 grilles au lieu de 5 ; y a une chance par grille (au lieu d'une pour tout le jeu) ; y a le simple et le multiple en un seul jeu (+5 numéros et + d'1 chance)... Je suis aux anges, j'en ai au moins pour 100 heures de programmation, et encore, si je fais un logiciel simple...

    PROBLEME N°1

    Je ne trouve pas comment importer Ionic.Zip : est-ce une DLL, est-ce autre chose, peux-tu me dire exactement où je trouve ce truc sur Seven ?

    Ou si toi tu as ce truc, de me l'envoyer, je le balancerai dans system32 et j'y ferais référence dans le programme et c'est vendu (mon adresse, voir dans l'enpied de cette réponse) ?

    PROBLEME N°2

    Comment sortir ça en fichier CSV avec ";" comme séparateur (ensuite j'en fais mon affaire en le gérant en fichier texte :

    Là j'ai :

    entry.Extract(".\" + entry.FileName)

    C'est quoi FileName (un mot clef, ou est-ce que ça peut être remplacé par le nom d'un fichier) ?

    Entry.Extract, oui-mais elle vont où les datas avec ça ?

    Ce que je voudrais c'est que dans le répertoire courant (ça je sais faire), il me ponde un fichier nommé : nouveau_loto.csv (qui soit un csv avec séparateur ";"), comment faire ?

    PROBLEME N° 3

    Je présume que je peux enlever des références (Windows.Base) ?

    Je présume toujours qu'à la place de l'URL je peux lui passer une adresse du répertoire en cours pour le fichier ZIP, car je le télécharge déjà, et il lui faut une routine spéciales d'erreurs multiples, donc est-ce que c'est bon si je fais :

    Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri(My.Application.Info.DirectoryPath & "\loto12lien.tx"))

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 25 octobre 2012 05:07
  • Bonjour Joseph,

    Pour le 1er problème, tu peux le télécharger là --> http://dotnetzip.codeplex.com/

    Il suffit de télécharger le zip puis prendre la DLL Ionic.Zip.dll dans zip-v1.9\Release.

     

    Problème 2 :

    _zip.Extract va extraire le fichier dans le sous-répertoire du nom du Zip du répertoire courant de l'application (nouveau_loto\nouveau_loto.csv). FileName correspond au nom de fichier dans le zip (nouveau_loto.csv).

     

    Problème 3 :

    Oui tu peux supprimer la réf WindowsBase. Oui à la place de l'url tu peux mettre le path du fichier téléchargé. du coup tu peux supprimer :

    Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri(My.Application.Info.DirectoryPath & "\loto12lien.tx"))

    tu remplace :

    Using _zip As ZipFile = ZipFile.Read(New MemoryStream(zipBytes))

    Par :

    Using _zip As ZipFile = ZipFile.Read(My.Application.Info.DirectoryPath & "\loto12lien.zip")

    le path dans Read doit être celui du fichier compressé que tu as déjà téléchargé (---> My.Application.Info.DirectoryPath & "\loto12lien.zip").

     

    Si tu ne comprends pas tout, revient vers moi

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 25 octobre 2012 05:59
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 25 octobre 2012 11:23
    Propriétaire
  • Lyamine,

    Ah... c'est presque ça, y a juste : un problème + un truc + une question, suite après le code :

     Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Dim erreur As String = ""
        Try
          My.Computer.Network.DownloadFile(leLien, My.Application.Info.DirectoryPath & "\nouveau_loto.zip")
        Catch ex As Exception
          If Mid(Err.Description, 1, 14) = "Le nom distant" Then Err.Number = 6
          Select Case Err.Number
            Case 5 : erreur = "5 : Introuvable (Erreur Internet 404)" & vbLf & vbLf & "vérifier l'adresse"
            Case 6 : erreur = ": Pas de connexion Internet, remédier, essayer plus tard."
            Case 57 : erreur = "57 : Ce fichier existe déjà, le supprimer péalablement."
          End Select
          MsgBox("ERREUR CHARGEMENT (zip)" & vbLf & vbLf & erreur, vbExclamation)
        End Try
        '
        Try
          erreur = "d"
          Using _zip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(My.Application.Info.DirectoryPath & "\nouveau_loto.zip")
            For Each entry As Ionic.Zip.ZipEntry In _zip
              entry.Extract(".\" + entry.FileName)
            Next
          End Using
          erreur = "k"
          Kill(My.Application.Info.DirectoryPath & "\nouveau_loto.zip")
        Catch ex As Exception
          Select Case erreur
            Case "d" : MsgBox("ERREUR  DECOMPRESSION (zip > csv)" & vbLf & vbLf & Err.Number & " : " & Err.Description, vbExclamation)
            Case "k" : MsgBox("ERREUR  SUPPRESSION ZIP" & vbLf & vbLf & Err.Number & " : " & Err.Description, vbExclamation)
          End Select
        End Try
        '
        ' mettre en état ici csv > txt
        Call calculGains()
      End Sub

    LE PROBLEME

    C'est qu'au lieu de me faire au bon endroit "loto_nouveau.csv" il me fait un dossier "loto_nouveau.csv" dans lequel il met le fichier, le bon "loto_nouveau.csv", ce qui donne un répertoire en son fichier "loto_nouveau.csv\loto_nouveau.csv"...

    Evidemment, ce serait mieux s'il ne mettait que le fichier "loto_nouveau.csv" ???

    LE TRUC

    Il me balance la dll enrégistrée en référence "ionic.zip.dll" dans le dossier local (..._bin\debug).

    Ça n'a peut être aucune importance ???

    UNE QUESTION

    Quand je vais publier, peux-tu me confirmer qu'il va bien tout seul empaqueter la dll ionic.zip et la distribuer où il faut ?

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 25 octobre 2012 12:04
  • Cher Aurel,

    Pas si vite :o)  c'est en discussion, je clôs toujours les postes quand c'est terminé.

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 25 octobre 2012 12:26
  • Alors pour la DLL ionic.zip qui ce trouve dans le bin de debug, c'est normal. Ton application l'a en référence. Lorsque tu va faire ton setup, il faudra le fournir avec. Après j'ai une méthode en l'ajoutant en ressource de l'applciation mais ca demande de coder avec System.Reflection.

     

    Le plus simple est de fournir la DLL avec l'application. Normalement il devrait l'ajouter tout seul, mais vérifie en testant. Pour le répertoire, c'est Ionic qui le crée, comme si tu décompressais un zip avec windows/winrar/7zip. Dès que je rentre, je regarde pour faire à partir du stream le fichier directement dans le répertoire racine.

     

    Si tu as du temps, recherche dans entry s'il y a une méthode ou propriété en référence à un stream ou byte array. Si c'est le cas utilise le pour enregistrer le fichier grâce à FileStream ou BinaryWriter. Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine jeudi 25 octobre 2012 14:12
    • Marqué comme réponse EhJoe jeudi 25 octobre 2012 15:27
    • Non marqué comme réponse EhJoe jeudi 25 octobre 2012 18:50
    jeudi 25 octobre 2012 14:06
  • Cher EhJoe

    Un seul message hors topique.

    On essaye seulement de respecter la politique interne sur le traitement des threads.

    C’est pour ça qu’on essaye parfois de précipiter les choses. 

    Cordialement,


    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 25 octobre 2012 14:19
    Propriétaire
  • Lyamine,

    Suite et fin, par ce code (suite après) :

     Rename(My.Application.Info.DirectoryPath & "\nouveau_loto.csv", My.Application.Info.DirectoryPath & "\nouveau_loto")
        Rename(My.Application.Info.DirectoryPath & "\nouveau_loto\nouveau_loto.csv", My.Application.Info.DirectoryPath & "\loto.csv")
        RmDir(My.Application.Info.DirectoryPath & "\nouveau_loto")

    J'ai un peu surchargé la mule, mais j'y suis arrivé. Heureusement grâce à toi sans qui je n'aurais pu déziper. C'est quand même dommage, l'OS accepte les dossiers avec "." d'extension/liaison, fait bien la différence dans ses messages d'erreurs entre fichier et dossier, mais quand il s'agit de déplacer un fichier d'un dossier portant le même nom là il ne sait plus... (car j'avais essayé de le déplacer et renommer avant de revenir, évidemment).

    Bon, le reste je sais, je vais remettre en ordre pour moi ce csv, bien le tabuler et l'appeler txt pour faire ensuite les calculs...

    Ouf !

    Mille merci cher ami Lyamine, au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse EhJoe jeudi 25 octobre 2012 15:26
    • Non marqué comme réponse EhJoe jeudi 25 octobre 2012 18:50
    jeudi 25 octobre 2012 15:25
  • Tu es la bienvenue l'ami. Je vais quand même regarder de mon coté pour te faire quelquechose de plus propre. Pour la lecture du fichier, au lieu de t'embeter à faire du parsing, utilise OleDB csv pour faire des requêtes type SQL.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 25 octobre 2012 15:45
  • Bonjour,

    Juste quelques hypothèses sur l'absence de classe pour gérer les .zip dans .Net, et donc de devoir passer par un produit tiers. Peut être as tu remarqué que sous Win 7, ainsi que sous XP (depuis le SP2 peut être) lors d'un clic droit sur un .zip dans l'explorateur, le menu contextuel propose un choix :

            Extraire tout ...

    qui permet de choisir un répertoire destination, et d'y extraire tous les fichiers. Un double clic sur un .zip ouvre ce zip sans extraire les fichiers. Cela est géré par une dll : %SystemRoot%\System32\zipfldr.dll

    Cette dll est également utilisée pour la création de .zip : si l'on sélectionne un ou plusieurs fichiers dans l'explorateur, on a un choix Envoyer vers -> Dossier compressé. Les outils sont donc là, problème : ils ne sont pas documentés, et ce ne doit pas être par hasard, tout simplement pour des problèmes de licences concernant le format, et l'algorithme de compression/décompression des fichiers zip, enfin c'est mon avis.

    Je ne connais à ce jour qu'une syntaxe pour utiliser cette dll, et qui équivaut au double clic :

            rundll32.exe zipfldr.dll,RouteTheCall "nom-du fichier-zip"

    Attention: bien respecter les espaces et la casse.

    Voilà. Au final MS propose une classe pour gérer les fichiers GZIP qui sont sous licence GNU via la classe GZipStream !!!!!

    Toutes choses égales par ailleurs, on est dans la même situation qu'avec certains format d'image sous VB6, avec les .GIF par exemple :-(


    Cordialement, Jacques

    jeudi 25 octobre 2012 16:24
  • Voilà le code :

    Dim csvFile As FileStream = File.OpenWrite(entry.FileName)
    entry.Extract(csvFile)
    csvFile.Close()

    Remplace la partie suivante :
    entry.Extract(".\" + entry.FileName)


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    jeudi 25 octobre 2012 17:46
  • Bonjour Jacques,

    Merci, mais... je ne comprends pas (ce qui n'est pas nouveau), j'ai fait ça :

    ' rundll32.exe zipfldr.dll,RouteTheCall My.Application.Info.DirectoryPath & "\nouveau_loto.zip""

    Mais il n'apprécie pas ma plaisanterie...

    N'aurais-tu pas un vague bout de code qui tourne ?

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 25 octobre 2012 18:48
  • Lyamine :

    Il n'accepte pas ENTRY.FILENAME, je n'ai aucune entête, tout est là.

    Using _zip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(My.Application.Info.DirectoryPath & "\nouveau_loto.zip")
            Dim csvFile As System.IO.FileStream = System.IO.File.OpenWrite(entry.FileName)
            For Each entry As Ionic.Zip.ZipEntry In _zip
              entry.Extract(csvFile)
              'entry.Extract(".\" + entry.FileName)
            Next
            csvFile.Close()
          End Using

    ???

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 25 octobre 2012 18:57
  • Le code est comme suit :

    Using _zip As ZipFile = ZipFile.Read(New MemoryStream(zipBytes))
                    For Each entry As ZipEntry In _zip
                        'Tu peux extraire dans un autre buffer pour le parse directement dans ton application sans créer de fichier
                        Dim csvFile As FileStream = File.OpenWrite(entry.FileName)
                        entry.Extract(csvFile)
                        csvFile.Close()
                        'entry.Extract(".\" + entry.FileName)
                    Next
    End Using

    Dans ton code tu as mit File.openwrite avant la déclaration du for each entry as ZipEntry... D'où le fait qu'il ne trouve pas entry.FileName.

    Jacques le problème de System.IO.Compression.GZip c'est qu'il bug. C'est pour cela que je ne l'utilise plus (d'habitude j'utilise zlib) :(   VOIR ICI

    Passer par rundll32.exe, personnellement je prends ça pour de la magouille VB6 qui avait des limites et peut très bien ne pas marcher d'un Windows à l'autre pour X raison (blocage de la fonction par l'admin. réseau, etc...)  . Le but est de faire tout par code. L'avantage de la méthode codé c'est qu'il ne sera plus obliger de générer le fichier sur le disque mais travailler en mémoire directement et être constamment à jour. L'avantage de l'enregistrer c'est qu'il va pouvoir manipuler le fichier via OLEDB



    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !




    • Modifié Lyamine jeudi 25 octobre 2012 20:27
    jeudi 25 octobre 2012 19:04
  • Bonsoir Lyamine,

    Marche pas !!!

    Dans ce code (voir la suite après) :

     Using _zip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(New System.IO.MemoryStream(zipBytes))
            For Each entry As Ionic.Zip.ZipEntry In _zip
              'Tu peux extraire dans un autre buffer pour le parse directement dans ton application sans créer de fichier
              Dim csvFile As System.IO.FileStream = System.IO.File.OpenWrite(entry.FileName)
              entry.Extract(csvFile)
              csvFile.Close()
            Next
          End Using

    ZIPBYTES n'est pas reconnu (1ere ligne) ???

    Nota bene : je n'utilise pas les entêtes on peut les oublier, et en plus on perd l'habitude de l'ascendance de l'instruction, donc je mets dans le code.

    Hum... etc.

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    jeudi 25 octobre 2012 20:53
  • Bonsoir Joseph,

    Voici le code complet pour ne plus faire d'amalgame (^_^) :

    Imports System.IO
    Imports System.Net
    Imports Ionic.Zip
    
    Module Module1
        Dim fdjHttp As WebClient
        Sub Main()
            Try
                'DL du zip, le conserver en mémoire
                fdjHttp = New WebClient()
                'je voulais faire un DL async mais je n'arrive plus à déclarer l'event handles en VB lol, je suis trop C#
                'donc utilisation synchrone
                Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri("https://media.fdj.fr/generated/game/loto/nouveau_loto.zip"))
                'reprise du buffer zipBytes
    
                Using _zip As ZipFile = ZipFile.Read(New MemoryStream(zipBytes))
                    For Each entry As ZipEntry In _zip
                        'Tu peux extraire dans un autre buffer pour le parse directement dans ton application sans créer de fichier
                        Dim csvFile As FileStream = File.OpenWrite(entry.FileName)
                        entry.Extract(csvFile)
                        csvFile.Close()
                        'entry.Extract(".\" + entry.FileName)
                    Next
                End Using
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
    
        End Sub
    End Module
     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !


    • Modifié Lyamine jeudi 25 octobre 2012 22:01
    • Marqué comme réponse EhJoe vendredi 26 octobre 2012 07:36
    jeudi 25 octobre 2012 21:53
  • Pour utiliser ce "petit truc" à partir de VB.Net :

    System.Diagnostics.Process.Start("rundll32.exe", "zipfldr.dll,RouteTheCall " & My.Application.Info.DirectoryPath & "\nouveau_loto.zip")

    Cela aura l'effet d'ouvrir le fichier zip dans l'explorateur, mais pas d'en extraire les fichiers, en fait le même effet qu'un double clic sur un .zip dans l'explorateur. Cela ne t'es donc pas utile.

    Ce que mon message voulait souligner, c'est que les outils sont présents dans le système d'exploitation, mais ne sont pas utilisables hors l'explorateur. Par contre MS diffuse une classe .NET pour gérer les fichier GZIP qui sont sous licence GNU, c'est à dire : licence libre. Mais pour les ZIP, il faut un produit tiers ...


    Cordialement, Jacques

    vendredi 26 octobre 2012 06:12
  • Bonjour Jacques,

    Ah oui, le zip est très mal géré, un peu mieux en vbNet qu'en 6, mais ça reste assez infernal en nombre de ligne et on rêve d'une fonction   r = decompresse(d'ici\ceci, à là \ cela).

    Mais manifestement MST veut s'imposer dans ce domaine aussi, est fait tout pour que l'éditeur de Winzip soit le moins pratique possible.

    La FDJ n'est pas non plus des plus maline en zipant son csv.

    Je viens aussi de voir que l'OS gère mal les dossiers avec point d'extension ou de liaison, il n'arrive pas à faire la différence avec les fichier si les deux portent le même nom (un.csv\un.csv) = (dossier\fichier). La fonction pour renommer en extrayant plante...

    Bon, ben je vois la fin avec Lyamine, en te remerciant de ton intervention.

    Toujours au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    vendredi 26 octobre 2012 07:05
  • Bonjoàur Lyamine,

    T'es un chef, ça marche aux petit oignons !

     Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        Dim erreur As String = ""
        Try
          Dim fdjHttp As System.Net.WebClient
          fdjHttp = New System.Net.WebClient()
          Dim zipBytes As Byte() = fdjHttp.DownloadData(New Uri(leLien))
          Using _zip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(New System.IO.MemoryStream(zipBytes))
            For Each entry As Ionic.Zip.ZipEntry In _zip
              Dim csvFile As System.IO.FileStream = System.IO.File.OpenWrite(entry.FileName)
              entry.Extract(csvFile)
              csvFile.Close()
            Next
          End Using
        Catch ex As Exception
          Select Case Mid(Err.Description, 1, 14)
            Case "Le nom distant" : erreur = "ERREUR  404  :  Défaut de connexion internet"
            Case "URI non valide" : erreur = "ERREUR  5  :  Lien du loto non invalide"
          End Select
          MsgBox(erreur, vbCritical)
          Exit Sub
        End Try
    End Sub

    Merci infiniment, question résolue grâce à toi.

    Au plaisir, cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire


    • Marqué comme réponse EhJoe vendredi 26 octobre 2012 07:36
    vendredi 26 octobre 2012 07:35
  • Bonjour Joseph,

    Pas de soucis


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    vendredi 26 octobre 2012 08:28