Page 1 sur 1

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

Publié : jeu. 23/sept./2010 19:55
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 .

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

Publié : ven. 24/sept./2010 7:54
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

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

Publié : ven. 24/sept./2010 21:10
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

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

Publié : sam. 25/sept./2010 8:10
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.

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

Publié : sam. 25/sept./2010 13:24
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

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

Publié : mar. 12/oct./2010 12:26
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.