Page 1 sur 2

Inclure fichier

Publié : sam. 11/juin/2011 17:38
par Programmes
Bonsoir à tous,
Je voudrais inclure dans un fichier exe de 40 ko un fichier zip de 1 406 509 ko. J'arrive à inclure mon fichier zip dans l'exe mais lors de l'extraction de ce fichier je n'arrive pas à lire le contenu. Je suis sur que j'ai fait une erreur à moins que çà ne soit possible? Voici le code:

Code : Tout sélectionner

OpenFile(0,"C:\Décompression\1.exe")
FileSeek(0,Lof(0))
WriteStringN(0,"###F1###")
TailleFichier=FileSize("C:\Décompression\3.zip")
*Buffer=AllocateMemory(TailleFichier)
ReadData(0,*Buffer,TailleFichier)
Debut=FileSize("C:\Décompression\1.exe")
WriteData(0,*Buffer,TailleFichier)
WriteStringN(0,"###FF1###")
CloseFile(0)
FreeMemory(*Buffer)
OpenFile(0,"C:\Décompression\1.exe")
Fin=FileSize("C:\Décompression\1.exe")
FileSeek(0,Debut)
*MemoryID=AllocateMemory(Fin-Debut)
CreateFile(1,"C:\Décompression\Fifi.zip")
bytes=ReadData(0,*MemoryID,Fin-Debut)
WriteData(1,*MemoryID,bytes)
CloseFile(0)
CloseFile(1)
Un grand merci à tous ce qui pourront me venir en aide!

Re: Inclure fichier

Publié : sam. 11/juin/2011 18:27
par Chris
Si j'ai bien compris, (pas sur), tu veux inclure un zip, et récupérer un zip
Et si tu te contentais tout simplement de faire comme ça?

Code : Tout sélectionner

If CreateFile(0, "Machin.zip") 
  WriteData(0, ?DebutZip, ?FinZip- ?DebutZip)
  CloseFile(0) 
EndIf


DebutZip: 
IncludeBinary "Machin.zip" 
FinZip: 

Re: Inclure fichier

Publié : sam. 11/juin/2011 18:44
par Programmes
J'ai essayé et ça ne marche pas. Après plusieurs recherche, c'est parce que la taille du fichier est trop importante...Apparamment avec includebinary ont est limité sur la taille...
Pour être bien clair, le fichier zip est bien inclus dans l'exe mais quand j'extrait le fichier zip est taille de ce fichier est égale à zéro! Tout mon problème est là!

Re: Inclure fichier

Publié : sam. 11/juin/2011 19:14
par Chris
Programmes a écrit :J'ai essayé et ça ne marche pas. Après plusieurs recherche, c'est parce que la taille du fichier est trop importante...Apparamment avec includebinary ont est limité sur la taille...
Pour être bien clair, le fichier zip est bien inclus dans l'exe mais quand j'extrait le fichier zip est taille de ce fichier est égale à zéro! Tout mon problème est là!
Étonnant. J'ai déjà inclus des fichiers de plus de 2 Mo sans problème et là je viens de faire un include avec un fichier .rar de 6.5 Mo

Re: Inclure fichier

Publié : sam. 11/juin/2011 19:29
par djes
Tu as bien la version complète?

Re: Inclure fichier

Publié : sam. 11/juin/2011 19:31
par graph100
Si tu as la version de démo, tu es limité en nombre de ligne, et donc tu ne peux inclure de trop gros fichiers. (dixit Dobro je crois :mrgreen: )

Re: Inclure fichier

Publié : sam. 11/juin/2011 19:39
par Chris
C'est vrai qu'il y a toujours cette histoire de version de démo. Je l'oublie toujours, celle-là.

J'ai du mal a assimiler le fait qu'on puisse essayer la version de démo de Pb pendant plus de quinze jours sans avoir envie de l'acheter. :mrgreen:

Re: Inclure fichier

Publié : sam. 11/juin/2011 19:46
par nico
Il y a un truc que je comprend pas, que tu utilises un programme externe pour mettre un fichier dans un exe ok, mais à l'extraction c'est l'exe lui même qui doit l'extraire et non pas à partir du programme externe.

Re: Inclure fichier

Publié : sam. 11/juin/2011 21:09
par Programmes
J'utilise bien la version complète de Purebasic (version 4.51). Par contre, j'ai fait une erreur. Mon fichier zip fait 1,34Go! Es-ce possible de l'inclure dans un exe?
Pour répondre à Nico, je suis tout à fait d'accord que c'est l'exe lui même qui créra le fichier zip. Pour le moment, je fais des essais et j'essaie de comprendre le fonctionnement...
Encore merci pour vos réponses...

Re: Inclure fichier

Publié : sam. 11/juin/2011 21:13
par nico
Je me penche dessus, normalement c'est très simple.

Re: Inclure fichier

Publié : sam. 11/juin/2011 21:46
par Programmes
Sympa!

Re: Inclure fichier

Publié : sam. 11/juin/2011 22:19
par Chris
Inclure un fichier de plus de 1 Go dans un exe, c'est pas trop le top, surtout du point de vue du téléchargement.

Il vaut mieux avoir un .exe de taille raisonnable, et des librairies additionnelles.
Ca a moins tendance à décourager le client qui voudrait télécharger le programme, et ça facilite les mises à jour.

Re: Inclure fichier

Publié : sam. 11/juin/2011 22:34
par Programmes
Qu'es-ce que tu entends par des librairies additionnelles? Là, je ne vois pas...

Re: Inclure fichier

Publié : sam. 11/juin/2011 22:42
par nico
Voilà:
IL faut compiler les deux codes en ascii ou unicode


Code : Tout sélectionner

;programme qui sert à injecter un fichier dans un exe

File$="C:\Users\nicolas\Desktop\Extraction.zip" ;penser à changer le chemin et le nom du fichier
Fichier$ = GetFilePart(File$)

If OpenFile(0,"C:\Users\nicolas\Desktop\test.exe");penser à changer le chemin
  LongueurFichier.l=Lof(0)
  FileSeek(0,LongueurFichier)
  If ReadFile(1,File$)
    LongueurZip.l=Lof(1)
    *buffer=AllocateMemory(LongueurZip)
    ReadData(1,*buffer,LongueurZip)
    CloseFile(1)
    WriteData(0,*buffer,LongueurZip)
    WriteLong(0,LongueurZip)
    WriteString(0,Fichier$, #PB_Ascii) ;mettre #PB_Unicode si vous compilez en unicode
    WriteLong(0,StringByteLength(Fichier$ , #PB_Ascii)) ;mettre #PB_Unicode si vous compilez en unicode
    FreeMemory(*buffer)
    ret.l=1
  EndIf 
  CloseFile(0)
EndIf

If ret
  Texte.s="Opération réussie"
Else 
  Texte="Echec de l'opération"
EndIf

MessageRequester("Info",Texte)

Code : Tout sélectionner

; compiler dans le même mode (ascii ou unicode) que l'injecteur
; l'exe a pour nom test.exe, c'est important pour l'exemple
; Extraction du fichier contenu dans l'Exe

If ReadFile(0,"test.exe") ; l'exe s'ouvre lui même
  LongueurFichier.l=Lof(0)
  
  FileSeek(0,LongueurFichier-4)
  LongueurName.l=ReadLong(0)
  
  FileSeek(0,LongueurFichier-LongueurName-4)
  *bufferName=AllocateMemory(LongueurName)
  ReadData(0,*bufferName,LongueurName)
  Name.s=PeekS(*bufferName,LongueurName)
                                                   
  MessageRequester("Info",Name)
  
  FileSeek(0,LongueurFichier-4-LongueurName-4)
  LongueurZip.l=ReadLong(0)
  
  If LongueurZip<>0
    FileSeek(0,LongueurFichier-4-LongueurName-4-LongueurZip)
    *buffer=AllocateMemory(LongueurZip)
    ReadData(0,*buffer,LongueurZip)
    If CreateFile(0,"copie_"+Name) ; extrait le fichier à la racine
      WriteData(0,*buffer,LongueurZip)
      CloseFile(0)
      ret=1
    EndIf 
    FreeMemory(*buffer)
  EndIf
  CloseFile(0)
EndIf

If ret
  Texte.s="Opération réussie"
Else 
  Texte="Echec de l'opération"
EndIf

MessageRequester("Info",Texte)

Re: Inclure fichier

Publié : sam. 11/juin/2011 22:45
par Chris
Programmes a écrit :Qu'es-ce que tu entends par des librairies additionnelles? Là, je ne vois pas...
Je me suis mal expliqué.
Ça dépend de ce que tu veux faire comme programme.

Par exemple, si c'est un programme qui sert à faire du dessin 3D, tu peux inclure quelques modèles dans l'exe pour que l'utilisateur puisse commencer à se familiariser avec le logiciel, et ensuite mettre d'autre modèles dans des sortes de "librairies", (des archives compactées en fait) que l'utilisateur pourrait télécharger au fur et a mesure de ses besoins (ou de ses finances :mrgreen: ).

Il y a beaucoup de programmes qui fonctionnent comme ça.
Band in A Box, par exemple. (Demande à Dobro, il doit connaître)

C'est un logiciel qui permet de faire des arrangements musicaux automatiquement.
Le logiciel contient quelques librairies de rythmes et d'arrangements, mais si tu veux vraiment l'utiliser, tu est pratiquement obligé de télécharger les librairies additionnelles. (Après passage à la caisse, évidemment. :lol: )