compresseur de fichier

Programmation d'applications complexes
gadjet35
Messages : 190
Inscription : ven. 21/oct./2005 7:49
Localisation : Quelque part en france !

compresseur de fichier

Message par gadjet35 »

bonjour j'ai programmer un petit compresseur de fichier...

Code : Tout sélectionner


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Frame3D_0
  #Frame3D_1
  #Button_0
  #Radio_0
  #Radio_1
  #Text_0
  #Text_1
  #Button_1
  #Radio_2
  #Radio_3
  #Text_2
  #Text_3
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 171, 204, 602, 302,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered , "Win_Comp   v4.5")
    If CreateGadgetList(WindowID())
      Frame3DGadget(#Frame3D_0, 20, 20, 270, 260, "COMPRESSER")
      Frame3DGadget(#Frame3D_1, 330, 20, 250, 260, "DECOMPRESSER")
      ButtonGadget(#Button_0, 80, 200, 130, 60, "Compresser")
      OptionGadget(#Radio_0, 60, 90, 30, 30, "")
      OptionGadget(#Radio_1, 60, 130, 30, 30, "")
      TextGadget(#Text_0, 100, 100, 160, 30, "Suprimer l'ancien fichier")
      TextGadget(#Text_1, 100, 140, 160, 30, "Ne pas suprimer l'ancien fichier")
      ButtonGadget(#Button_1, 390, 200, 130, 60, "Decompresser")
      OptionGadget(#Radio_2, 370, 90, 30, 30, "")
      OptionGadget(#Radio_3, 370, 130, 30, 30, "")
      TextGadget(#Text_2, 400, 100, 150, 20, "Suprimer le pack")
      TextGadget(#Text_3, 400, 140, 160, 20, "Ne pas suprimer le pack")
    EndIf
  EndIf
EndProcedure

open_window_0()

 Repeat
  Select WaitWindowEvent()
   Case #PB_EventGadget
    Select EventGadgetID()
     Case #button_0
      pack$ = OpenFileRequester("Créer le pack","","tout|*.*",0)
      fichier_comp$ = OpenFileRequester("Fichier à compresser","","tout|*.*",0)
       CreatePack(pack$)
        AddPackFile(fichier_comp$,9)
       ClosePack()
       If #radio_0 = 1
        DeleteFile(fichier$)
       EndIf
     Case #button_1
      pack$ = OpenFileRequester("Ouvrir le pack","","tout|*.*",0)
      fichier_decomp$ = OpenFileRequester("Destination du fichier à decompresser","","tout|*.*",0)
       OpenPack(pack$)
       memoire = NextPackFile()
       taille = PackFileSize()
        CreateFile(0,fichier_decomp$)
         WriteData(memoire,taille)
        CloseFile(0)
       ClosePack()
       If #radio_2 = 1
        DeleteFile(pack$)
       EndIf
    EndSelect
   Case #PB_EventCloseWindow
    quit = 1
  EndSelect
 Until quit = 1
comment le trouver vous ???
bonne journer à tous !!!
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

je poste juste pour dire que j'ecris un compresseur aussi !

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: compresseur de fichier

Message par Anonyme2 »

gadjet35 a écrit :bonjour j'ai programmer un petit compresseur de fichier...
comment le trouver vous ???
2 bug qui se ressemblent

cliques sur compresser ou décompresser la fenêtre s'ouvre et fais annuler les 2 fois et là ça plante
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

C'est bien, mais il faut toujours faire un test quand tu ouvres un fichier.

Parce que si le fichier n'est pas ouvert quand le code arrive à la commande suivante, tu risque le plantage.

Et une des raison pour lesquelles un fichier n'a pas été ouvert, c'est parce que tu as annulé l'ouveture.
Donc, toujours faire:

Code : Tout sélectionner

Fichier$ = OpenFileRequester(...)
If Fichier$
  Ton code
  ...
Endif
Ensuite, quand tu crée une archive ou quand tu ouvres une archive, c'est à toi de donner l'extension du fichier, pas à l'utilisateur. (Sauf pour les archiveurs multi-format comme WinRar, mais là, c'est une autre histoire).

Pour ça, tu peux spécifier l'extension dans le masque de la boite de dialogue.

Par exemple, pour créer l'archive :

Code : Tout sélectionner

pack$ = SaveFileRequester("Créer le pack","","Archive Pak|*.pak",0)
et pour ouvrir l'archive :

Code : Tout sélectionner

pack$ = OpenFileRequester("Ouvrir le pack","","Archive Pak|*.pak",0)
J'ai donné une extension qui s'appelle *.pak au type de fichier, mais tu peux mettre ce que tu veux.

Enfin, quand tu crée un fichier, utilise SaveFileRequester(), et quand tu ouvres un fichier, utilise OpenFileRequester().

Voilà ton code corrigé, (en partie), mais il y a certainement d'autres chose que je n'ai pas vu.

Code : Tout sélectionner

;- Window Constants 
; 
Enumeration 
  #Window_0 
EndEnumeration 

;- Gadget Constants 
; 
Enumeration 
  #Frame3D_0 
  #Frame3D_1 
  #Button_0 
  #Radio_0 
  #Radio_1 
  #Text_0 
  #Text_1 
  #Button_1 
  #Radio_2 
  #Radio_3 
  #Text_2 
  #Text_3 
EndEnumeration 


Procedure Open_Window_0() 
  If OpenWindow(#Window_0, 171, 204, 602, 302,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar | #PB_Window_WindowCentered , "Win_Comp   v4.5") 
    If CreateGadgetList(WindowID()) 
      Frame3DGadget(#Frame3D_0, 20, 20, 270, 260, "COMPRESSER") 
      Frame3DGadget(#Frame3D_1, 330, 20, 250, 260, "DECOMPRESSER") 
      ButtonGadget(#Button_0, 80, 200, 130, 60, "Compresser") 
      OptionGadget(#Radio_0, 60, 90, 30, 30, "") 
      OptionGadget(#Radio_1, 60, 130, 30, 30, "") 
      TextGadget(#Text_0, 100, 100, 160, 30, "Suprimer l'ancien fichier") 
      TextGadget(#Text_1, 100, 140, 160, 30, "Ne pas suprimer l'ancien fichier") 
      ButtonGadget(#Button_1, 390, 200, 130, 60, "Decompresser") 
      OptionGadget(#Radio_2, 370, 90, 30, 30, "") 
      OptionGadget(#Radio_3, 370, 130, 30, 30, "") 
      TextGadget(#Text_2, 400, 100, 150, 20, "Suprimer le pack") 
      TextGadget(#Text_3, 400, 140, 160, 20, "Ne pas suprimer le pack") 
    EndIf 
  EndIf 
EndProcedure 

Open_Window_0() 

Repeat 
  Select WaitWindowEvent() 
    Case #PB_EventGadget 
      Select EventGadgetID() 
        
        Case #Button_0 
          pack$ = SaveFileRequester("Créer le pack","","Archive Pak|*.pak",0) 
          fichier_comp$ = OpenFileRequester("Fichier à compresser","","tout|*.*",0)
          
          If fichier_comp$
            CreatePack(pack$) 
            AddPackFile(fichier_comp$,9) 
            ClosePack() 
            If #Radio_0 = 1 
              DeleteFile(fichier$) 
            EndIf 
          EndIf
          
        Case #Button_1 
          pack$ = OpenFileRequester("Ouvrir le pack","","Archive Pak|*.pak",0)
          If pack$
            ;fichier_decomp$ = OpenFileRequester("Destination du fichier à decompresser","","tout|*.*",0) 
            fichier_decomp$ = SaveFileRequester("Destination du fichier à decompresser","","tout|*.*",0) 
            
            If fichier_decomp$
              OpenPack(pack$) 
              memoire = NextPackFile() 
              taille = PackFileSize() 
              CreateFile(0,fichier_decomp$) 
              WriteData(memoire,taille) 
              CloseFile(0) 
              ClosePack() 
              If #Radio_2 = 1 
                DeleteFile(pack$) 
              EndIf 
              
            EndIf
          EndIf
          
      EndSelect 
    Case #PB_EventCloseWindow 
      quit = 1 
  EndSelect 
Until quit = 1
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Petite précision, mais là, ça n'a rien à voir.

Tu as mis des OptionGadget() pour choisir d'effacer ou non les fichiers.
C'est bien, mais il faudrait que quand tu ouvres le programme, il y en ait au moins un de coché dans chaque fonction. (Compresser, et Décompresser).

Tu peux remplacer tes quatre OptionGadget() par deux CheckBoxGadget(), un dans "Compresser", et l'autre dans "Décompresser".

Si le CheckBox est coché, tu effaces le fichier, sinon, tu le garde.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Voila mon compresseur (le decompresseur est en debut de redaction)
Il marche comme ceci:
Chaque paquets de 255 octets est analysé. S'il y a une suite d'un meme octet, le programme le note. Il examine toutes les suites de chaque octets. Puis il en retiens 5 maxi (les plus belles suites).
Ensuite, il commence par ecrire dans la fichier compressé combien d'octets sont concerné (exemple : 01; ce qui veux dire qu'un seul type d'octet est conserné). Puis il note quel est cet octet (exemple apres notre 01 : 'FF' ce qui veux dire que sqeul les suites de l'octet 'FF' sont compressé). Puis il ecrit les 255 octets du fichier en remplacant chaque chaines.
Exemple complet :
Il commence a ecrire ceci :
03 00 01 FF
Cela veux dire que 3 octets sont concerné par la compression : tous les octets "00" les octets "01" et les octets "FF"
Ensuite, pour cette chaine originale :
FF FF FF FF 44 01 01 01 02 08 58 41 00 00 00 00 47
il ecrira :
FF 04 44 01 03 02 08 58 41 00 04 47

Code : Tout sélectionner

file$="d:\votre_fichier"
long=FileSize(file$)

CreateFile(1, file$+".sph") 

Dim chiffre(255)

ReadFile(0, file$)
stop=0

run:
If long>255
long2=255
long-255
Else
long2=long
stop=1
EndIf

Dim fichier.w(long2)
Dim verif.w(255)
For i=1 To long2
look.w = ReadByte()
If look<0
look+256
EndIf
fichier(i)=look
verif(look)+1
Next

;oooooooooooooooooooooooooooooo

Dim plusgrand(255)
Dim cmb(255)
plusgrand=0

For analyse=0 To 255
If verif(analyse)<5
Goto nxt
EndIf
zero=0
stat=0
For i=1 To long2

If zero>0
If fichier(i)=analyse
zero+1
Else
;  Debug ("analyse de "+Str(analyse)+" ("+Str(zero)+")")
stat+zero-2
zero=0
EndIf
EndIf

If fichier(i)=analyse And zero=0
zero+1
EndIf
Next
If zero>0
;Debug ("analyse de "+Str(analyse)+" ("+Str(zero)+")")
stat+zero-2
EndIf
If stat>4
;  Debug ("Statistique ("+Str(analyse)+") = "+Str(stat))
plusgrand(plusgrand)=analyse
cmb(plusgrand)=stat
plusgrand+1
EndIf
nxt:
Next

If plusgrand=0 ;  rien n'est compressable donc on recopie betement cette partie
UseFile(1)
If fichier(1)<=5
WriteByte(0) 
EndIf
For i=1 To long2
WriteByte(fichier(i)) 
Next
Goto suite
EndIf

UseFile(1)
WriteByte(plusgrand) ; on ecrit combien de type d'octets sont compressé
plusgrand-1

tri:
u=0
For i=0 To plusgrand
If cmb(i)<cmb(i+1)
n=cmb(i+1)
cmb(i+1)=cmb(i)
cmb(i)=n
n=plusgrand(i+1)
plusgrand(i+1)=plusgrand(i)
plusgrand(i)=n
u=1
Goto tri
EndIf
Next
If u=1
Goto tri
EndIf

; Debug ("---")

If plusgrand>4 ;  on ne garde que maxumum 5 type d'octzets a compresser (les 5 plus interessants)
plusgrand=4
EndIf
For i=0 To plusgrand
WriteByte(plusgrand(i))
Next
UseFile(0)

Dim comp.w(256)

For n=0 To plusgrand
u=plusgrand(n)
cmb=0
la=1
For i=1 To long2
a=fichier(i)

If a=u
If cmb=0
comp(la)=a
la+1
EndIf
cmb+1
EndIf

If a<>u 
If cmb>0
comp(la)=cmb+512
la+1
cmb=0
comp(la)=a
la+1
Else
comp(la)=a
la+1
EndIf
EndIf

Next
If cmb>0
comp(la)=cmb+512
la+1
EndIf

long2=la-1

Dim fichier.w(long2)

For i=1 To long2 ;   recopie
fichier(i)=comp(i)
Next

Next

UseFile(1)
For i=1 To long2
WriteByte(comp(i)) 
Next

suite:

UseFile(0) 
If stop=0
Goto run
EndIf

CloseFile(0)
CloseFile(1)
Antoine
Messages : 7
Inscription : sam. 19/nov./2005 23:08

Message par Antoine »

Comment reconais-tu la fin d'un secteur de 255 octets dans ton fichier compressé ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

C'était peut-être pas la peine de mettre ton programme dans le post qui concerne celui de Gadget35.

Pas très cool, ça :?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

tres connu ton system ! :D

l'inconvegnant c'est que si ton programme rencontre tres peu d'octets identique se suivant
ton code :


If plusgrand=0 ; rien n'est compressable donc on recopie betement cette partie
     UseFile (1)
     If fichier(1)<=5
         WriteByte (0)
     EndIf
     For i=1 To long2
         WriteByte (fichier(i))
     Next
     Goto suite
EndIf



fait qu'il ne compresse rien du tout !

il doit bien compresser les "a-plat" d'une meme couleur
mais une image tramée ? , pas du tout car il n'y a pas un seul points qui se suivent qui soit de meme couleur dans une image tramé, donc pas d'octets de meme nature se suivant ! :)
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Antoine a écrit :Comment reconais-tu la fin d'un secteur de 255 octets dans ton fichier compressé ?
Simple : ce sont des tranches de 255 octets uniquement. La tranche prochaine a :
- soit une entete comprise entre 0 et 5 (0=pas compressé)
- soit un octet > 5 ce qui equivaut a "0"

Quand je dis qu'il n'y a que des tranches de 255 octets, cela erst vrai aussi dans le fichier compressé mais il faut compter les octets car une tranche de 255 peut etre egal a ceci :
01 FF FF FF
Entete : 01 FF (un seul octet compressé, tous les "FF")
les "FF" compressé : FF FF (les FF et on en a FF soit 255)
gadjet35
Messages : 190
Inscription : ven. 21/oct./2005 7:49
Localisation : Quelque part en france !

Message par gadjet35 »

merci pour votre sur les bugs
bonne journer à tous !!!
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Tenez, j'ais un fond de tirroir à refiler:

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;----------de----------;;;;
;;;Ekkim Alia "@The Fortix";;;
;;;;;;;>le 08/DEC/2006<;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Enumeration

  #Open_Window_0
  
EndEnumeration


Enumeration

  #ButtonImage_0
  #ButtonImage_1
  #Image0
  #Image1
  
EndEnumeration



Repeat

  Repeat

    Clr01=RGB(Random(255),Random(255),Random(255))
    Clr02=RGB(Random(255),Random(255),Random(255))

  Until Clr01<>Clr02
  
  Clr01$=Hex(Clr01)
  Clr02$=Hex(Clr02)

  Clr01=Val(Clr01$)
  Clr02=Val(Clr02$)

Until Clr01> 10000 Or Clr02> 10000



If CreateImage(#Image0,125,40) 

  StartDrawing(ImageOutput(#Image0))
  Box(0,0,125,40,Clr02)
  DrawText(12,13,"COMPRESSER",Clr01,Clr02) 
  StopDrawing() 

  If CreateImage(#Image1,125,40)
 
    StartDrawing(ImageOutput(#Image1))
    Box(0,0,125,40,Clr02)
    DrawText(5,13,"DECOMPRESSER",Clr01,Clr02) 
    StopDrawing()
    
  EndIf
   




EndIf



Procedure Open_Window_0()

  If OpenWindow(#Open_Window_0, 587, 340, 265, 60, "   ..::_FORTIX_COMPACT_FILE_::.. ",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar )
  
    If CreateGadgetList(WindowID(#Open_Window_0))
    
      ButtonImageGadget(#ButtonImage_0, 5, 10, 125, 40, ImageID(#Image0))
      ButtonImageGadget(#ButtonImage_1, 135, 10, 125, 40, ImageID(#Image1))   
      
    EndIf
    
  EndIf
  
EndProcedure 



Open_Window_0() 



SetWindowColor(#Open_Window_0, Clr01) 
GadgetToolTip(#ButtonImage_0, "Appuyer ici pour ouvrir et compresser un fichier.")
GadgetToolTip(#ButtonImage_1, "Appuyer ici pour ouvrir et décompresser un fichier (*.FCF).")



Repeat
 
  EventID = WaitWindowEvent()
    
  If EventID = #PB_Event_Gadget

    Select EventGadget()
        
      Case #ButtonImage_0
      
        Repeat
        
          fichier_comp$ = OpenFileRequester("Fichier à compresser","","tout sauf  '*.FCF' (Fortix_Compact_Format)|*.*",0)
          
          If GetExtensionPart(fichier_comp$)="FCF"
          
            f=0
            
          Else
          
            f=1
            
          EndIf
          
        Until f=1
            
          If fichier_comp$
            
          CreatePack(fichier_comp$+".FCF")  
          AddPackFile(fichier_comp$,9)
          ClosePack()
          Chemin$ = GetPathPart(fichier_comp$)
          Fichier$ = GetFilePart(fichier_comp$)
              
          Repeat
          
            Delay(1)
                    
            If ExamineDirectory(0,Chemin$,Fichier$+".FCF")
            
              buffer$ = Space(#MAX_PATH) 
              buffer$ =fichier_comp$+".FCF"  
              SetFileAttributes_(@buffer$,#FILE_ATTRIBUTE_READONLY);:Debug "protegé"              
                      
              If DeleteFile(fichier_comp$)
                  
                FinishDirectory(0)
                t=1
                          
              EndIf
                        
            EndIf 
                       
          Until t=1
              
        EndIf
                    
      Case #ButtonImage_1
        
        fichier_decomp$ = OpenFileRequester("Selection du fichier à decompresser","","'*.FCF' (Fortix_Compact_Format)|*.FCF",0 )
            
        If fichier_decomp$
          
          Chemin0$ = GetPathPart(fichier_decomp$)
          Fichier0$ = GetFilePart(fichier_decomp$)
          
          ExamineDirectory(0, Chemin0$, Fichier0$)          
          NextDirectoryEntry(0) 
          attrib0=GetFileAttributes(fichier_decomp$)

          
          If attrib0  &  #PB_FileSystem_Compressed And attrib0  &  #PB_FileSystem_ReadOnly;:Debug attrib0   
          
            buffer$ = Space(#MAX_PATH) 
            buffer$ = fichier_decomp$             
            SetFileAttributes_(@buffer$,#FILE_ATTRIBUTE_NORMAL);:Debug "plus protegé" 
            FinishDirectory(0)           
                       
            If OpenPack(fichier_decomp$)
           
              memoire = NextPackFile() 
              taille = PackFileSize() 
              fichier_decomp2$=ReplaceString(fichier_decomp$,".FCF","    ")
                
              If fichier_decomp2$
                
                If CreateFile(0,fichier_decomp2$)
                 
                  WriteData(0,memoire,taille) 
                  CloseFile(0) 
                  ClosePack()
                  Chemin$ = GetPathPart(fichier_decomp2$)
                  Fichier$ = GetFilePart(fichier_decomp2$)
  
                  Repeat
                  
                    Delay(1)
                      
                    If ExamineDirectory(0,Chemin$,Fichier$)
                      
                      If DeleteFile(fichier_decomp$)
                      
                        FinishDirectory(0)
                        s=1
                          
                      EndIf
                          
                    EndIf 
                         
                  Until s=1
                      
                EndIf 
                     
              EndIf
                   
            EndIf
                
          EndIf
          
        EndIf
         
    EndSelect
  
  EndIf
   
Until EventID = #PB_Event_CloseWindow

CloseWindow(#Open_Window_0)

End
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;----------de----------;;;;
;;;Ekkim Alia "@The Fortix";;;
;;;;;;;>le 09/DEC/2006<;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

comme on dit: "Petit mais COSTO" :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonjour FORTIX

Ton programme a du rester coincé dans le tirroir, :wink: car je suis bien arrivé a compresser un fichier, mais je ne suis pas arrivé a le décompresser.

Par contre, comme il m'a effacé l'original............. :?
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Bonsoirs Kwai chang caine, le truc c'est qu'il ne faut pas renommer le fichier une fois compréssé d'ailleur j'ais pris le soin de prendre deux mesures de sécuritées à cette éffet:

1- la transformation du fichier en lecture seul après compression

2- lors de " l'OpenfileRequester" il y a que le format FCF qui peux être pris en charge c'est à dire la version une fois compréssé

Astuce: :idea:
si tu as effectivement renommé ce dernier ne le suprime surtouts pas car tous n'est pas perduts!!
figure toi qu'il te suffit tous simplement de r'ajouter l'extension".FCF" tout à la fin du nom complet et ensuite réactive l'exe en choisissant "Decompresser" puis retrouve le fichier en question avec cette fois si l'extension .FCF

et en principe y a pas de problème :wink:

et j'avoue j'aurais dus donner un minimun d'explication, je m'excuse Kwai chang caine :cry:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Salut Fortix,

J'ai aussi pu compresser, mais mon fichier FCF ne veut pas se décompresser pour revenir au stade initial..

Ouinnn :?
Répondre