Page 1 sur 1

Décompresser des fichiers au format xz

Publié : jeu. 03/août/2023 0:11
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

Re: Décompresser des fichiers au format xz

Publié : jeu. 03/août/2023 0:44
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

Re: Décompresser des fichiers au format xz

Publié : jeu. 03/août/2023 8:57
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:

Re: Décompresser des fichiers au format xz

Publié : jeu. 03/août/2023 12:38
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

Re: Décompresser des fichiers au format xz

Publié : jeu. 03/août/2023 13:49
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$)

Re: Décompresser des fichiers au format xz

Publié : jeu. 03/août/2023 14:01
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.

Re: Décompresser des fichiers au format xz

Publié : jeu. 03/août/2023 18:58
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