Page 1 sur 1

Lire directement un fichier précis dans une archive 'Packer'

Publié : lun. 27/févr./2006 14:12
par Dionyzos
Bonjour,

Je suis en train de développer un programme, et je voudrais avoir un exe + un gros fichier 'DATA.RES' qui contient toutes les ressources de mon prog (images, sons, videos, ...) et qui est une archive faite avec la lib 'Packer'

Mon fichier packer est ok : j'arrive parfaitement à décompresser les fichiers sur le discdur, mais je ne trouve pas la méthode pour extraire en mémoire un seul fichier et l'utiliser dans mon code principale comme une ressources classique.

Voici le code exemple qui doit normalement récupérer un fichier précis d'une archive Packer et de la "catcher" pour l'utiliser n'importe où dans le prog :

Code : Tout sélectionner

Enumeration 
  #WIN
  #IMG
  #G_IMG
  #TXT
EndEnumeration


Procedure.l ExtractFile(File$)
  NomPack$ = "data.res"
  
  If OpenPack(NomPack$)
    Repeat
      AdrMem = NextPackFile()
      TailleFich = PackFileSize()
      If TailleFich = -1 : Break : EndIf
      NomFich.s = Space(TailleFich)
      NomFich = PeekS(AdrMem, TailleFich)
    Until NomFich = File$
    ProcedureReturn AdrMem    
  Else
    MessageRequester("Erreur", "Impossible d'ouvrir le fichier Pack", #PB_MessageRequester_Ok)
  EndIf

EndProcedure


*AdrMem = ExtractFile("mur.bmp")
If *AdrMem = 0
  Debug "memoire nulle"
  End
EndIf


CatchImage(#IMG, *AdrMem)

If OpenWindow(#WIN,0,0,300,250, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "image")
  If CreateGadgetList(WindowID(0)) 
    TextGadget(#TXT, 0,0,80,50,"Nom du fichier : "+PeekS(*AdrMem))
    ImageGadget(#G_IMG,0,50,300,300,UseImage(#IMG))
  Else
    Debug "erreur de gadget"
  EndIf
  
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Else
  Debug "erreur de fenetre"
EndIf

End
J'ai cherché et lu plein de topic qui parlaient de la lib Packer, mais je ne comprends pas bien sont fonctionnement #aieaieaie

Pour ouvrir une archive c'est OpenPack(NomFichPack) -> ok
pour parcourir et lire chaque fichier contenu dans l'archive c'est NextPackFile() -> ok
pour lire la taille du fichier courant c'est PackFileSize() -> parfait

Mais je ne comprends pas comment lire simplement le nom du fichier pour savoir si c'est celui que je veux extraire. Il n'existe pas de commande du type PackFileName()

Bref je suis perdu :cry:

Qq'un peut-il m'aider svp ?

Publié : lun. 27/févr./2006 14:44
par AWEAR
Je ne crois pas qu'il soit possible de nommer les fichiers d'un pack, cependant, dans ton cas, tu sais quels fichiers sont à l'intérieur, donc tu sais leur nom, je m'explique :
tu mets trois fichiers
truc1.jpg
truc2.jpg
truc3.jpg
donc le premier nextpackfile() recuperera truc1
le second truc2
etc...
Cependant, si tu souhaite vraiment savoir les noms des fichiers, moi ce que j'avais fait, c'était de mettre tous les noms de fichiers contenu dans la pack à la fin, séparé par un #
A la fin du fichier, il y avait donc
truc1.jpg#truc2.jpg#truc3.jpg#0030
le 0030 correspondant à l'espace occupé par les noms de fichiers
Il me suffisait donc de lire les quatres derniers caractères du fichier, puis de positionner le pointeur de lecture à "longeur du fichier" - "nombre indiqué(30)" - 4, et après de faire un stringfield avec un #
Donc le premier fichier extrait correspondait à Stringfield(chaine$, 1, "#")
le second Stringfield(chaine$, 2, "#")
etc..
Voilà, j'espère avoir été clair.

Publié : lun. 27/févr./2006 16:12
par Dionyzos
Merci AWEAR, tu m'as donné une idée :
Je vais utiliser une liste chainée pour gérer de manière automatique ma liste de fichiers contenus dans le pack.
Et je vais faire une petite procedure qui me retourne le numéro d'ordre du fichier demandé, et ensuite je n'aurais plus qu'a stopper la boucle NextPackFile() au numéros correspondant :D

Je vais essayer ca :)

Publié : lun. 27/févr./2006 16:15
par Dr. Dri
Sinon il y a aussi le principe de "format de fichier"
Dans ton fichier tu as une entete avec par exemple la listes des fichiers (nom, position dans le fichier, taille, crc etc, comme tu veux)

Dri

Publié : lun. 27/févr./2006 20:02
par Dionyzos
parfait, j'ai donc réussi à faire une procédure ExtractFile() dans laquel je donne une nom de fichier en entrée et elle me l'extrait du fichier PACK (sans écrire sur le disk), et me retourne en sortie l'adresse mémoire du fichier.

Du genre :

Code : Tout sélectionner

*AdrMem = ExtractFile("monImage.bmp")
CatchImage(0, *AdrMem)
Donc avec la fonction CatchTruc(#IDTruc, *AdressMemTruc)
ca marche super avec :
les images : CatchImage() et CatchSprite()
les sons wav : CatchSound()

Mais par contre avec les fichiers de type Midi, MP3, MPEG, ...
je vois pas comment faire vu que la fonction CatchMovie() n'existe pas :?

Qq'un à une idée ? :(