Fichiers autoextractible = Misére ..

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Fichiers autoextractible = Misére ..

Message par Kwai chang caine »

Bonjour à tous.

Ca fait une semaine que je me cogne la tête a éssayé de faire un fichier autoextractible d'un répertoire.

J'ai essayé de nombreux codes trouvé sur ce forum, et avec chacun j'ai un probleme.

En fait je me retrouve avec un fichier pack qui a été créé avec la fonction packer à partir d'un repertoire de Inf0Byt3

http://www.purebasic.fr/english/viewtop ... it++100000

Ce que je n'arrive pas à faire c'est un exe de ce fichier pack qui lorsque je clic dessus recréé le pack (ça j'y suis arrivé) puis apres enchaine de module depacker, pour se retrouver au final avec le repertoire d'origine à l'endroit ou on le veut.

Je me heurte aussi au fait que l'on ne puisse pas mettre de variable dans includebinary, alors comment peut on donner le chemin complet d'un fichier en dur lorsque ce fichier n'est jamais le meme ??? 8O

J'ai vu des bons codes qui créé un exe pour l'inclure apres par exemple celui de DORIAN, http://purebasic.forum-gratuit.com/view ... ludebinary, mais je ne suis pas arrivé à le modifier pour qu'il puisse enchainer le depacker.

C'est pas toujours facile le pure :?

Si quelqu'un pouvait me tendre une main secourable, je lui en serais eternellemnt reconnaissant, car a force d'essayer noir de code, je ne sais plus ou j'en suis. :(

Merci
Bonne journée à tous
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Je vois pas trop ton problème ?

Packer ? apparement tu y arrive
Créer l'Exe avec le pack ?
Changer le repertoire dans l'Exe ?
Dépacker à partir de l'exe ?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

ahh DORIAN, je suis content de te parler directement.
Vu que tu est l'auteur du super code :

http://purebasic.forum-gratuit.com/view ... ludebinary

Code : Tout sélectionner

; #New_Ligne = Chr(13) + Chr(10) ; Saut de ligne 

Procedure.s GetExeName() 
ExeName.s = Space (255) 
GetModuleFileName_ (0, @ExeName, 255) 
ProcedureReturn ExeName 
EndProcedure 

If MessageRequester ( "Fichier auto - extractible" , "Voulez-vous dézipper le fichier ?" , #PB_MessageRequester_YesNo ) = 7 
; pressed No button 
End 
EndIf 

Path.s = PathRequester ( "Chemin :" , "C:\" ) 

Exe.s = GetExeName() 

; Lecture des Datas 
ReadFile (0, Exe) 
Position.l = 9728 ; Taille de cet éxécutable après compilation 
FileSeek (Position) 
*Nom = AllocateMemory (256) ; Memoire pour la réception du nom de fichier 
ReadData (*Nom, 256) 
Nom.s = Trim ( PeekS (*Nom)) 
Position = Position + 256 
*Buffer = AllocateMemory ( FileSize (Exe) - Position) ; Memoire pour réceptionner 
; les datas 
ReadData (*Buffer, FileSize (Exe) - Position) 
CloseFile (0) 

; Ecriture des Datas 
CreateFile (0, Path + Nom) 
WriteData (*Buffer, FileSize (Exe) - Position) 
CloseFile (0) 

MessageRequester ( "Info" , "Le fichier " + Nom + " a été décompréssé" ) 

 


Add.exe (le createur de d'auto...) : 
Citation: 


File.s = OpenFileRequester ( "Ouvrir ..." , "" , "Tout (*.*)|*.*" , 0) 
Exe.s = SaveFileRequester ( "Sauver l'éxecutable ...," , "" , "Executable|*.exe" , 0) 

OpenFile (0, File) 
*Buffer = AllocateMemory ( FileSize (File)) 
ReadData (*Buffer, FileSize (File)) 
CloseFile (0) 

CreateFile (0, Exe + ".exe" ) 
WriteData (?MyExec, ?MyEndExec - ?MyExec) 
Position.l = 9728 ; Même taille que dans la source précédente 
FileSeek (Position) 
*Nom = AllocateMemory (256) 
PokeS (*Nom, GetFilePart (File)) 
WriteData (*Nom, 256) 
WriteData (*Buffer, FileSize (File)) 
CloseFile (0) 


DataSection 
MyExec: 
IncludeBinary "exe.exe" ; Executable 
MyEndExec: 
EndDataSection 
Module depacker

Code : Tout sélectionner

Procedure DePackFolder(Pack.s, Folder.s) 

 Global Dim Limp.s(100000) 
 Global Dim Bizkit.s(100000) 
 Global index1:index1=0 
 Global index2:index2=0 

 If Right(folder.s,1)<>"\":folder.s+"\":EndIf 
  
 CreateDirectory(folder) 
  
 OpenPack(pack.s) 
 
 If CreateFile(0,GetTemporaryDirectory()+"filelist.tmp") 
  
  *File=NextPackFile() 
  Size=PackFileSize() 
  WriteData(0,*File,Size) 
  CloseFile(0) 
 EndIf 

 If CreateFile(0,GetTemporaryDirectory()+"dirlist.tmp") 

  *File=NextPackFile() 
  Size=PackFileSize() 
  WriteData(0,*File,Size) 
  CloseFile(0) 

 EndIf 

 If ReadFile(0,GetTemporaryDirectory()+"dirlist.tmp") 

  While Not Eof(0) 
   CreateDirectory(folder+ReadString(0)) 
  Wend 

  CloseFile(0) 
 
 EndIf 
 
 If ReadFile(0,GetTemporaryDirectory()+"filelist.tmp") 
 
  nr = Val(ReadString(0)) 
 
  For index1 = 1 To nr 
  
   file.s = folder+ReadString(0) 
   Debug "Extracting: " + file 
  
   If CreateFile(1,file) 
    *File=NextPackFile() 
    Size=PackFileSize() 
    WriteData(1,*File,Size) 
    CloseFile(1) 
   EndIf 
  
  Next index1 
  
  CloseFile(0) 
 
 EndIf 
    
EndProcedure 
Il marche nickel mais quand je clique sur ton exe, il me ramene bien le fichier d'origine, donc le fichier pack, pas le repertoire.
Normal tu va me dire puisque ton code a transformé le pack en exe, donc dans l'autre sens il transforme l'exe en pack, mais ou dois je mettre le module depacker dans ton code afin qu'il me transforme l'exe directement en repertoire.

Voila la cause de mes insommnies :lol:

Si tu peut, ou quelqu'un peut m'aider, j'en peu plus. :?

Merci de ton interet
Bonne journée
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Je me replonge dans mon code et j'essaye de te répondre ^^

Edit :

Si j'ai bien compris je ferais un truc du style :

Code : Tout sélectionner

 ; #New_Ligne = Chr(13) + Chr(10) ; Saut de ligne

Procedure.s GetExeName()
ExeName.s = Space (255)
GetModuleFileName_ (0, @ExeName, 255)
ProcedureReturn ExeName
EndProcedure

If MessageRequester ( "Fichier auto - extractible" , "Voulez-vous dézipper le fichier ?" , #PB_MessageRequester_YesNo ) = 7
; pressed No button
End
EndIf

Path.s = PathRequester ( "Chemin :" , "C:\" )

Exe.s = GetExeName()

; Lecture des Datas
ReadFile (0, Exe)
Position.l = 9728 ; Taille de cet éxécutable après compilation
FileSeek (Position)
*Nom = AllocateMemory (256) ; Memoire pour la réception du nom de fichier
ReadData (*Nom, 256)
Nom.s = Trim ( PeekS (*Nom))
Position = Position + 256
*Buffer = AllocateMemory ( FileSize (Exe) - Position) ; Memoire pour réceptionner
; les datas
ReadData (*Buffer, FileSize (Exe) - Position)
CloseFile (0)

; Ecriture des Datas
CreateFile (0, Path + Nom)
WriteData (*Buffer, FileSize (Exe) - Position)
CloseFile (0) ; Ici ton fichier pack est dézippé et près à être traité

DePackFolder(Path + Nom, Path) ; Ici tu lance ta fonction

DeleteFile(Path + Nom) ; Ici tu supprime le fichier pack temporaire

MessageRequester("Info", "L'opération est effectuée")
Si c'est bien sa, il faudrait l'améliorer un peu ^^.

Par contre la taille 9728 spécifier dans mes 2 codes ne sont plus valides car la source est modifier, il faudrait le recalculer comme dans le post où tu as trouvé ce code. Sinon, ce soir ou demain soir, je devrais être un peu plus libre (j'ai un compte rendu de TP d'élect à finir pour demain ^^)

Si c'est pas sa, tu pourrais me passer ton code de package et un exemple d'utilisation (plus ou moins barbard pour voir si sa marche ^^)
Dernière modification par Dorian le jeu. 19/oct./2006 13:33, modifié 2 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Tu es un ange ... #nounours
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Je ne suis pas sur d'avoir compris ton problème, mais j'ai plancher une fois sur un installeur et je te balance mon code :

1°) Compacter tous tes fichiers, ici le code lie le nom des fichier dans un fichier texte "Liste_fichier_instal.txt", à toi d'adapter ce code pour qu'il liste les fichier d'un répertoire. Remarque il insert le fichier liste des fichiers pour le decompactage.

Code : Tout sélectionner

repertoire_execution$=GetCurrentDirectory()

CreatePack("CpureTansPack") 
AddPackFile("Liste_fichier_instal.txt")
nb_fich=0
If OpenFile(0,"Liste_fichier_instal.txt")

   Repeat 
      fichier$= ReadString(0)
      If FileSize(repertoire_execution$+"..\"+fichier$)=-1
         MessageRequester("Alerte fichier inexistant",repertoire_execution$+"..\"+fichier$)
         End
      EndIf
      Debug repertoire_execution$+"..\"+fichier$
      nb_fich=nb_fich+1
      AddPackFile(repertoire_execution$+"..\"+fichier$)
   Until Loc(0)=Lof(0)

ClosePack()

CloseFile(0)
MessageRequester("Nombre de fichier compacter",Str(nb_fich))
Else
   MessageRequester("Alerte","Pas de fichier liste de fichier")
EndIf

2°) Creation de l'instal qui va inclure le pack dans l'exe

Code : Tout sélectionner



path$=PathRequester("Ou installer les fichier ?",GetCurrentDirectory())
If path$<>""
   CreateFile(0, path$+"NomdetonPackTemp")
   WriteData(0, ?pack, ?fin - ?pack)
   CloseFile(0) 
   OpenPack(path$+"NomdetonPackTemp")
   adresse=NextPackFile()
   Taille = PackFileSize()
   CreateFile(1,path$+"Liste_fichier_instal.txt")
   WriteData(1,adresse,Taille)
   CloseFile(1)
   ReadFile(1,path$+"Liste_fichier_instal.txt")
   
   
   i=1
   Repeat
      adresse=NextPackFile()
      Debug adresse
      If adresse<>0
         i=i+1
         Taille = PackFileSize()
         Debug Taille
         fichier$=path$+ReadString(1)
         Debug fichier$
         
         MakeSureDirectoryPathExists_(fichier$)
         CreateFile(2,fichier$)
         WriteData(2,adresse,Taille)
         CloseFile(2)
         
      EndIf
      
      
   Until adresse=0
   ClosePack()

EndIf
End
DataSection 
pack : IncludeBinary "CpureTansPack"
fin: ;fin du fichier CpureTransPack
EndDataSection

Il ne te reste plus qu'a creér l'executable avec ce code et lorsque tu le lance tu choisi un répertoire et hop....

J'ai consience que je te balance cela sans trop d'explication mais peut être que tu le comprendras, sinon n'hesite pas...

a+ et bon courage.
Vive le temps libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Ah bah la ....

Toi aussi tu es un ange #nounours

Merci beaucoup, je vais essayer avec ton code, si DORIAN arrive a faire quelque chose, avec vous deux je vais marcher sur l'eau .. :lol:

Sincerement grand merci
Bonne journée
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Dorian
Messages : 489
Inscription : mar. 15/mars/2005 15:33

Message par Dorian »

Pourrais-tu me passer le code d'archivage de dossier.

Comme sa entre 2 révisions de DS pour lundi et quelques codes en C pour l'IUT, je tenterais de faire qlq chose ^^.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Je te remercie et reste sans voix #pinkie

J'en ai marre, je tourne en rond depuis 10 jours.
Je me retrouve toujours avec un fichier pack et un deuxieme programme qui marche si je le compile pour qu'il devienne un exe.
Mais moi, je voudrais que ce soit le premier programme qui créé l'exe apres avoir créé le pack, directement sans que j'ai à le compiler manuellement et que j'ai plus qu'a cliquer sur le 2e qui serait donc l'exe pour décompresser les fichiers du répertoire.
J'comprend plus rien et plus je reflechi et moins je comprend. #pendu

Voici tout le code du packer (J'espere ne pas en avoir oublié :

Code : Tout sélectionner

Procedure PackFolder(Folder.s, Pack.s, Level) 
 
 Global Dim List.s(100000) 
 Global Dim Limp.s(100000) 
 Global Dim Bizkit.s(100000) 
 Global Index1
 Global Index2
 Global Index3
 Index1=0  
 Index2=0 
 Index3=0 
 
 If Right(Folder.s, 1) <> "\"
  Folder.s + "\"
 EndIf 
 
 If FillArray(Folder.s, Folder.s) = 1 
  
  CreateFile(0, GetTemporaryDirectory() + "Filelist.tmp") 
  WriteStringN(0, Str(Index1)) 
 
  For PackN = 1 To Index1 
   If Limp(PackN - 1) <> "" 
    WriteStringN(0, Limp(PackN - 1)) 
   EndIf 
  Next PackN 
 
  CloseFile(0) 
  
  CreateFile(0, GetTemporaryDirectory() + "Dirlist.tmp") 
 
  For PackN = 1 To Index2 
   If Bizkit(PackN - 1) <> "" 
    WriteStringN(0, Bizkit(PackN - 1)) 
   EndIf 
  Next PackN 
  
  CloseFile(0) 
  CreatePack(Pack.s) 
  AddPackFile(GetTemporaryDirectory() + "Filelist.tmp", 9) 
  AddPackFile(GetTemporaryDirectory() + "Dirlist.tmp", 9) 
 
  For Add = 1 To Index1 
   If List(Add - 1) <> "" 
    AddPackFile(List(Add - 1), Level) 
   EndIf 
  Next Add 
  
  ClosePack() 
  DeleteFile(GetTemporaryDirectory() + "Filelist.tmp") 
  DeleteFile(GetTemporaryDirectory() + "Dirlist.tmp") 
 
 EndIf 
 
 MessageRequester("Er-Setup", "Le fichier " + DerniereOccurence(GetGadgetText(#TexteCheminRepertoireSource)) + ".pak vient d'etre créé avec succés sur " + GetGadgetText(#TexteCheminRepertoireDestination), 0) 
 
EndProcedure 

Procedure FillArray(EntryPath.s, Oldpath.s)  ; Fonctionne avec PackFolder(folder.s,pack.s,level)

 If Right(EntryPath.s, 1) <> "\"
  EntryPath + "\"
 EndIf 
   
 UsedDirectory = ExamineDirectory(#PB_Any, EntryPath, "*.*") 
   
 While NextDirectoryEntry(UsedDirectory) 
   
  EntryType.l = DirectoryEntryType(UsedDirectory) 
  EntryName.s = DirectoryEntryName(UsedDirectory) 
   
  If EntryName = "." Or EntryName = ".." 
   Continue 
  EndIf 
   
  If EntryType = #PB_DirectoryEntry_File 
   TheFile.s = RemoveString(EntryPath + EntryName, Oldpath.s) 
   Limp(Index1) = TheFile.s 
   Index1 = Index1 + 1 
   List.s(Index3) = EntryPath + EntryName 
   Index3 = Index3 + 1 
  EndIf 
   
  If EntryType = #PB_DirectoryEntry_Directory 
   FillArray(EntryPath + EntryName, Oldpath.s) 
   Bizkit.s(Index2) = RemoveString(EntryPath + EntryName, Oldpath.s) 
   Index2 = Index2 + 1 
  EndIf 
    
 Wend
  
 FinishDirectory(UsedDirectory) 
 ProcedureReturn 1 

EndProcedure 

Procedure.s MakeDirectory(Filestring.s)
 
 filename.s  = GetFilePart(filestring) 
 directory.s = GetPathPart(filestring) 
 drivename.s = Left(directory, 3) 
 directory.s = Mid(directory, 4, Len(directory) - 3) 
 make.s      = drivename 
 
 While FindString(directory,"\", 1) <> 0 
 
  position = FindString(directory,"\", 1) 
  temp.s = Left(directory, position -1) 
  directory = Mid(directory, position + 1, Len(directory) - position) 
  make + temp + "\" 
  CreateDirectory(make) 
 
 Wend 
 
 ProcedureReturn make 

EndProcedure 

Procedure DePackFolder(Pack.s, Folder.s) 

 Global Dim Limp.s(100000) 
 Global Dim Bizkit.s(100000) 
 Global index1:index1=0 
 Global index2:index2=0 

 If Right(folder.s,1)<>"\":folder.s+"\":EndIf 
  
 CreateDirectory(folder) 
  
 OpenPack(pack.s) 
 
 If CreateFile(0,GetTemporaryDirectory()+"filelist.tmp") 
  
  *File=NextPackFile() 
  Size=PackFileSize() 
  WriteData(0,*File,Size) 
  CloseFile(0) 
 EndIf 

 If CreateFile(0,GetTemporaryDirectory()+"dirlist.tmp") 

  *File=NextPackFile() 
  Size=PackFileSize() 
  WriteData(0,*File,Size) 
  CloseFile(0) 

 EndIf 

 If ReadFile(0,GetTemporaryDirectory()+"dirlist.tmp") 

  While Not Eof(0) 
   CreateDirectory(folder+ReadString(0)) 
  Wend 

  CloseFile(0) 
 
 EndIf 
 
 If ReadFile(0,GetTemporaryDirectory()+"filelist.tmp") 
 
  nr = Val(ReadString(0)) 
 
  For index1 = 1 To nr 
  
   file.s = folder+ReadString(0) 
   Debug "Extracting: " + file 
  
   If CreateFile(1,file) 
    *File=NextPackFile() 
    Size=PackFileSize() 
    WriteData(1,*File,Size) 
    CloseFile(1) 
   EndIf 
  
  Next index1 
  
  CloseFile(0) 
 
 EndIf 
    
EndProcedure 
Je te remercie beaucoup de ta patience
Bonne soiree
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre