Décompresser des fichiers au format xz

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Décompresser des fichiers au format xz

Message par cage »

Bonsoir,

Dans une de mes applications, je récupère sur internet des fichiers au format xz (XZ - Wikipédia)
J'ai essayé avec PB de décompresser ces fichiers, mais il semble que ce ne soit pas supporté, a moins d'une erreur de ma part.
Voici un code de test:

Code : Tout sélectionner

file$ = "C:\Users\admin\Downloads\Database.db.xz"

;UseZipPacker()
;UseTARPacker()
UseLZMAPacker()
;UseBriefLZPacker()


If OpenPack(0, file$, #PB_PackerPlugin_Lzma) 
  ; List all the entries
  If ExaminePack(0)
    While NextPackEntry(0)
      Debug "Name: " + PackEntryName(0) + ", Size: " + PackEntrySize(0)
    Wend
  EndIf
  ClosePack(0)
EndIf
J'ai essayé toutes les combinaisons possibles sans succès.
Pour l'instant, je me suis retourné vers le site XZ Utils qui fournit les utilitaires ligne de commande pour lister/extraire le contenu des fichiers compressés au format xz
J'ai copié ces utilitaires dans un dossier Y:\WIN\ qui est dans le PATH système.
La commande suivante m'affiche bien le contenu du fichier:

Code : Tout sélectionner

EnableExplicit

Define file$ = "C:\Users\admin\Downloads\Database.db.xz"

ClearClipboard()

RunProgram("cmd.exe","/c xz.exe -l "+file$+" 2>&1|clip",#Empty$,#PB_Program_Wait|#PB_Program_Hide)

Debug GetClipboardText()
Savez vous si ce format de fichier xz est ou sera supporté par PB
Merci a vous,
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Décompresser des fichiers au format xz

Message par cage »

Pour décompresserle fichier au format xz

Code : Tout sélectionner

file$ = "C:\Users\admin\Downloads\Database.db.xz"
  
RunProgram("cmd.exe","/c xz.exe -d -k -f "+file$,#Empty$,#PB_Program_Wait|#PB_Program_Hide)
EndIf
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Décompresser des fichiers au format xz

Message par Marc56 »

Hello Cage,

S'agissant d'un EXE, et non d'une commande interne au shell de Windows (cmd.exe) il est inutile d'invoquer ce dernier.
Tu peux donc simplifier:

Code : Tout sélectionner

RunProgram("xz.exe",  "-d -k -f "+file$,#Empty$,#PB_Program_Wait|#PB_Program_Hide)
ça fait donc un processus de moins et tu peux capter la sortie.

PS. Perso, pour traiter les archives que PB ne gère pas ou quand il y a des sous-dossiers, j'utilise 7zip
(Pour les archives de grande taille j'utilise WinRar)

Formats pris en charge par 7zip:
Compression et décompression: 7z, XZ, BZIP2, GZIP, TAR, ZIP et WIM
Uniquement décompression: APFS, AR, ARJ, CAB, CHM, CPIO, CramFS, DMG, EXT, FAT, GPT, HFS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RPM, SquashFS, UDF, UEFI, VDI, VHD, VHDX, VMDK, XAR et Z.


7zip installe toujours 4 programmes:
- 7zFM (File Manager): l'interface classique
- 7z.exe : La ligne de commande
- 7zG : (Graphic): la version ligne de commande avec en plus une fenêtre de dialogue qui permet de suivre, mettre en pause et arrêter.
Les deux versions utilisent la même syntaxe.
Il y a aussi une version DLL que je n'ai jamais utilisé.
7zip peut être livré avec un programme à condition de le mentionner dans « À propos de ... »
:wink:
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Décompresser des fichiers au format xz

Message par cage »

Bonjour,

@Marc56:
Merci pour ta réponse dont je tire la conclusion que le format xz n'est pas supporté par PB.
Je connais 7z et je l'ai sur mon PC sans pour autant m'en servir.
J'ai fais l'essai de 7z.exe et ça fonctionne très bien avec les archives xz
Donc, c'est une solution a retenir.
Au quotidien, j'utilise Bandizip version gratuite qui me donne pleine satisfaction.
Le dossier d'installation "C:\Program Files\Bandizip\" contient un fichier bz.exe a utiliser en ligne de commande.
Le format xz est supporté par cet utilitaire.
Je l'ai copié dans Y:\WIN qui est dans le PATH système.
Je ne sais pas si j'ai le droit de fournir cet utilitaire avec une application.
Je suis d'accord avec toi pour l'utilisation de RunProgram() sans passer par cmd.exe mais uniquement pour la décompression sans possibilité de récupérer la sortie si elle existe.
Si tu l'utilise pour lister le contenu de l'archive, tu dois obligatoirement utiliser cmd.exe pour récupérer le texte.
Du moins d'après tous les tests que j'ai pu effectuer.
Concernant 7zip, je vais essayer de voir ce qu'il est possible de faire avec la DLL
Encore merci pour ta rapidité a répondre a mes questions.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Décompresser des fichiers au format xz

Message par Marc56 »

On peut récupérer la sortie sans passer par CMD en utilisant ReadProgramString
Exemple dérivé de l'aide PB sur RunProgram

Code : Tout sélectionner

File$ = "C:\tmp\test.xz"
SetCurrentDirectory("c:\tmp\")

Run = RunProgram("7z.exe", " l " + File$, "", #PB_Program_Open | #PB_Program_Read)
If Run 
    While ProgramRunning(Run)
        If AvailableProgramOutput(Run)
            Output$ + ReadProgramString(Run) + Chr(13)
        EndIf
    Wend
    CloseProgram(Run)
EndIf

MessageRequester("Sortie", Output$)
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Décompresser des fichiers au format xz

Message par cage »

Parfaitement, c'est une solution que j'utilise aussi dans certains cas.

Je ne sais pas pourquoi, mais je lui préfère souvent la solution "2>&1|CLIP", question a sa facilité d'utilisation.
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Décompresser des fichiers au format xz

Message par cage »

J'ai commencé a découvrir comment utiliser les DLL
Pas si évident que ça.
J'ai essayé la fonction Import "7z.dll" / EndImport sans succès car plantage a chaque essai.
Message d'erreur : PureBasic - Linker error / error: Invalid machine type in object 'y:\win\7z.dll'.
Voici mon code de test et si quelqu'un pouvait me mettre sur la voie, je lui en serait éternellement reconnaissant.

Code : Tout sélectionner

EnableExplicit

Global lib7z, f7z, fonction$

IncludePath "y:\win\"

; Import "7z.dll" ;;; provoque un plantage 
;   
; EndImport

lib7z=OpenLibrary(#PB_Any,"7z.dll")

If lib7z
  Debug "Librairie 7z.dll ouverte"
  If ExamineLibraryFunctions(lib7z)
    Debug ">Liste des fonctions:"
    While NextLibraryFunction()
      Debug "..."+LibraryFunctionName()
    Wend
  EndIf
  Debug #Empty$
  Restore Fonctions
  Repeat
    Read.s fonction$
    If fonction$ = #Empty$
      Break
    EndIf
    f7z=GetFunction(lib7z, fonction$)
    If f7z
      Debug "Fonction Ok '"+fonction$
    Else
      Debug "Fonction Ko '"+fonction$
    EndIf
  ForEver
  CloseLibrary(lib7z)
Else
  Debug "Librairie 7z.dll absente"
EndIf

;;; Librairie 7z.dll
DataSection
  Fonctions:
    Data.s "CreateDecoder"
    Data.s "CreateEncoder"
    Data.s "CreateObject"
    Data.s "GetHandlerProperty"
    Data.s "GetHandlerProperty2"
    Data.s "GetHashers"
    Data.s "GetIsArc"
    Data.s "GetMethodProperty"
    Data.s "GetModuleProp"
    Data.s "GetNumberOfFormats"
    Data.s "GetNumberOfMethods"
    Data.s "SetCaseSensitive"
    Data.s "SetCodecs"
    Data.s "SetLargePageMode"
    Data.s #Empty$
EndDataSection
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Répondre