PureZip et décompression d'1 zone mémoire vers DD

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
africanos
Messages : 20
Inscription : lun. 04/févr./2008 18:44

PureZip et décompression d'1 zone mémoire vers DD

Message par africanos »

Bonjour a tous ;
j'ai parcouru toute la doc de la librairie PureZip pour trouver la fonction qui me permet de décompresser un fichier zip chargé en mémoire ,vers le disque dur,mais je n'ai pas trouvé la bonne fonction .
sachant que le fichier zip compressé en memoire contient des fichiers et des dossiers, c.a.d le fichier zip en mémoire est obtenu en compressant plusieurs fichiers et dossiers.
j'espere que mon message est clair et que vous pourrez m'aider merci :D .
Dernière modification par africanos le ven. 24/sept./2010 16:24, modifié 1 fois.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: PureZip et décompression d'1 zone mémoire vers DD

Message par gnozal »

PureZIP ne peut pas décompresser un fichier en mémoire, car aucune fonction de ZLIB (la librairie que j'utilise) ne le permet à ma connaissance.

Pour ce genre de choses, j'utilise PureLZMA.
Les fonctions de PureLZMA-Packer-Mem (incluses dans PureLZMA) permettent de lire des archives PureLZMA incluses dans des datasections.

Code : Tout sélectionner

;
; PureLZMA - Packer - Mem Extension test
;
EncryptionKey.s = ""
;
; If PureLZMA_Archive_Create("c:\purebasic\program\MemArchiveTest.arc")
  ; PureLZMA_Archive_Compress("c:\PureBasic\Program\PureLZMA_Test.pb", 1, EncryptionKey)
  ; PureLZMA_Archive_Compress("c:\PureBasic\Program\PureLZMA_Test2.pb", 1, EncryptionKey)
  ; PureLZMA_Archive_Compress("c:\PureBasic\Program\PureLZMA_Test3.pb", 0, EncryptionKey)
  ; PureLZMA_Archive_Compress("c:\PureBasic\Program\PureLZMA_Test4.pb", -1, EncryptionKey)
  ; PureLZMA_Archive_Close()
; EndIf
; End
;
DataSection
  ArchiveBufferStart:
  IncludeBinary "c:\purebasic\program\MemArchiveTest.arc"
  ArchiveBufferEnd:
EndDataSection
;
If PureLZMA_MemArchive_Read(?ArchiveBufferStart, ?ArchiveBufferEnd - ?ArchiveBufferStart)
  Status = PureLZMA_MemArchive_FindFirst()
  ;
  While Status
    ;
    If PureLZMA_MemArchive_GetArchiveInfo(@ArchiveInfo.LZMA_ArchiveInfo)
      Debug "----------------"
      Debug "CRCUnpacked    = $" + RSet(Hex(ArchiveInfo\CRCUnpacked, #PB_Long), 8, "0")
      Debug "CRCPacked      = $" + RSet(Hex(ArchiveInfo\CRCPacked, #PB_Long), 8, "0")
      Debug "CRCPacked CALC = $" + RSet(Hex(PureLZMA_MemArchive_GetCRC(), #PB_Long), 8, "0")
      Debug "LengthUnpacked = " + Str(ArchiveInfo\LengthUnpacked)
      Debug "LengthPacked   = " + Str(ArchiveInfo\LengthPacked) + " (" + StrF(ArchiveInfo\LengthPacked / ArchiveInfo\LengthUnpacked * 100, 2) + "% of original)"
      Debug "LZMAFlags      = " + Str(ArchiveInfo\LZMAFlags)
      Debug "FileAttributes = $" + Hex(ArchiveInfo\FileAttributes)
      Debug "Filename       = '" + ArchiveInfo\Filename + "'"
    EndIf
    ;
    Status = PureLZMA_MemArchive_FindNext()
    ;
  Wend
  ;
  PureLZMA_MemArchive_Close()
EndIf
africanos
Messages : 20
Inscription : lun. 04/févr./2008 18:44

Re: PureZip et décompression d'1 zone mémoire vers DD

Message par africanos »

Merci gnozal,
vous avez fait du très bon boulot "in PureLZMA-Packer library" :)
j'ai etudié votre exemple et les exemples fournis avec PureLZMA , mais je cherche comment préparer une archive unique à partir d'un dossier contenant des fichiers et des sous dossiers .
pour expliquer mieux ce que je cherche;
1-préparer une archive d'un site web (contenant des pages HTML et des dossiers contenant des images pour ces pages)
2-Mettre l'archive unique dans la DataSection.
3-une fois cette archive est chargé en mémoire , pendant l'exécution du programme ,l'archive est décompressé sur le disque dur ,pour restituer mon dossier original .
Merci une autre fois :D
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: PureZip et décompression d'1 zone mémoire vers DD

Message par gnozal »

africanos a écrit :j'ai etudié votre exemple et les exemples fournis avec PureLZMA , mais je cherche comment préparer une archive unique à partir d'un dossier contenant des fichiers et des sous dossiers .
PureLZMA permet de faire une archive unique à partir d'un répertoire et de son arborescence : il suffit de parcourir le(s) répertoire(s) (avec ExamineDirectory()) et d'ajouter les fichiers un par un à l'archive avec PureLZMA_Archive_Compress(), ou encore plus simple utiliser PureLZMA_Archive_AddFiles().
Une fois l'archive unique obtenue, on la place dans une datasection et on y accède via les fonctions de PureLZMA-Packer-Mem.
africanos
Messages : 20
Inscription : lun. 04/févr./2008 18:44

Re: PureZip et décompression d'1 zone mémoire vers DD

Message par africanos »

Salut, gnozal,

J'ai essayé ce que vous m'avez proposé .le code ci_dessous crée en faitt l'archive monSite.arc ,mais quand ce dernier et décompressé ,je n'obtiens que quelques fichiers du dossier monSite ,c.à.d les sous dossiers du dossier monSite et d'autres fichiers manquent , malheureusement :roll: .
voici le code :

Code : Tout sélectionner

Global  filenam.s

Procedure CompressRecursive(fldname.s)
  Protected nDir.l, pthfldr.s, entryname.s
  pthfldr = fldname+"\"
 
  nDir = ExamineDirectory(#PB_Any, fldname, "*.*")
  While NextDirectoryEntry(nDir)
    entryname = DirectoryEntryName(nDir)
    If entryname <> "." And entryname <> ".."
      entryname = pthfldr+entryname
      Select DirectoryEntryType(nDir)
        Case #PB_DirectoryEntry_Directory: CompressRecursive(entryname)
        Case #PB_DirectoryEntry_File     :
          PureLZMA_Archive_Compress(entryname, 1)
      EndSelect
    EndIf
  Wend
  FinishDirectory(nDir)
EndProcedure

;==============================================
filenam.s="c:\monSite"
 fileTCz.s = StringField(GetFilePart(filenam),1,".")+".arc"
    If PureLZMA_Archive_Create(fileTCz)
      Debug "Création de " + fileTCz
      If FileSize(filenam) = -2: CompressRecursive(filenam)
      Else
        PureLZMA_Archive_Compress(filenam, 1)
      EndIf
      PureLZMA_Archive_Close()
    EndIf
j'espère que votre prochain message règlera le problème.
Merci de vos idées et de votre aide :D
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: PureZip et décompression d'1 zone mémoire vers DD

Message par gnozal »

Bonjour,

en lisant votre code je dirais qu'il y a un gros problème avec la fonction récursive.

Je n'ai pas PB sous la main, aussi le plus simple serait d'utiliser PureLZMA_Archive_AddFiles() qui gère la récursion automatiquement.
Répondre