problème de fichier ouvert, mal ouvert, pas ouvert...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

bonjour,je traîne une erreur depuis quelques semaines et je pense avoir trouver mon problème mais je ne suis pas certain...

voici le code initial.....

Le code a été fourni par Zorro...

Code : Tout sélectionner

; Demo: Streaming AES file encode/decode
; netmaestro August 2010
; Purebasic 4.51

Declare Encode(void)
Declare Decode(void)

OpenWindow(0,0,0,200,120,"Cryptor!",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(0, 50,20,100,20,"Encrypt a file")
ButtonGadget(1, 50,50,100,20,"Decrypt a file")
CreateStatusBar(0, WindowID(0))
AddStatusBarField(200)
StatusBarProgress(0,0,0,#PB_ProgressBar_Smooth,0,100)

Repeat
      EventID = WaitWindowEvent()
      Select EventID
      Case #PB_Event_Gadget
            Select EventGadget()
            Case 0
                  CreateThread(@Encode(), 0)
                  
            Case 1
                  CreateThread(@Decode(), 0)
            EndSelect
      EndSelect
Until EventID = #PB_Event_CloseWindow

End


Procedure Encode(void)
      
      chunksize = 4096
      rawfilename$ = OpenFileRequester("Please choose a file to encrypt:","","",0)
      encfilename$ = rawfilename$+".enc"
      
      If OpenFile(0, rawfilename$)
                  If CreateFile(1, encfilename$)
                              DisableGadget(0,1)
                              DisableGadget(1,1)
                              
                              length.q = Lof(0)
                              numparts = length/chunksize
                              lastchunksize = length%chunksize
                              If lastchunksize
                                    numparts+1
                                    lastchunk = numparts
                              Else
                                    lastchunk = 0
                              EndIf
                              
                              *raw     = AllocateMemory(chunksize)
                              *secure  = AllocateMemory(chunksize)
                              
                              StartAESCipher(0, ?key, 256, ?iVector, #PB_Cipher_CBC|#PB_Cipher_Encode)
                              
                              For i=1 To numparts
                                    If i=lastchunk
                                          FillMemory(*raw, chunksize, 0, #PB_Byte)
                                          ReadData(0, *raw, lastchunksize)
                                    Else
                                          ReadData(0, *raw, chunksize)
                                    EndIf
                                    AddCipherBuffer(0, *raw, *secure, chunksize)
                                    WriteData(1, *secure, chunksize)
                                    prog.d = i/numparts*100
                                    StatusBarProgress(0,0, Int(prog))
                                    Delay(1)
                              Next
                              If lastchunksize
                                    WriteLong(1, lastchunksize)
                              Else
                                    WriteLong(1, chunksize)
                              EndIf
                              
                              FinishCipher(0)
                        CloseFile(0)
                  CloseFile(1)
                  
                  FreeMemory(*raw)
                  FreeMemory(*secure)
                  
                  MessageRequester("Finished", "Encrypted file "+encfilename$+" saved",#MB_ICONINFORMATION)
                  StatusBarProgress(0,0,0)
                  
                  DisableGadget(0,0)
                  DisableGadget(1,0)
                  
            EndIf
      EndIf
EndProcedure

Procedure Decode(void)
      
      chunksize = 4096
      
      encfilename$ = OpenFileRequester("Please choose a file to decrypt:","","",0)
      rawfilename$ = SaveFileRequester("Please choose a new name for the decrypted file","","",0)
      
      If OpenFile(0, encfilename$)
                  FileSeek(0, Lof(0)-4)
                  lastchunksize = ReadLong(0)
                  FileSeek(0, 0)
                  If CreateFile(1, rawfilename$)
                              DisableGadget(0,1)
                              DisableGadget(1,1)
                              
                              length.q = Lof(0)
                              numparts = length/chunksize
                              
                              *raw     = AllocateMemory(chunksize)
                              *secure  = AllocateMemory(chunksize)
                              
                              StartAESCipher(0, ?key, 256, ?iVector, #PB_Cipher_CBC|#PB_Cipher_Decode)
                              
                              For i=1 To numparts
                                    ReadData(0, *secure, chunksize)
                                    AddCipherBuffer(0, *secure, *raw, chunksize)
                                    If i=numparts
                                          WriteData(1, *raw, lastchunksize)
                                    Else
                                          WriteData(1, *raw, chunksize)
                                    EndIf
                                    prog.d = i/numparts*100
                                    StatusBarProgress(0,0, Int(prog))
                                    Delay(1)
                              Next
                              
                              FinishCipher(0)
                        CloseFile(0)
                  CloseFile(1)
                  
                  FreeMemory(*raw)
                  FreeMemory(*secure)
                  
                  MessageRequester("Finished", "Decrypted file "+rawfilename$+" saved",#MB_ICONINFORMATION)
                  StatusBarProgress(0,0,0)
                  
                  DisableGadget(0,0)
                  DisableGadget(1,0)
            EndIf
      EndIf
EndProcedure


DataSection
      key:
      Data.b $8C,$15,$51,$2C,$0C,$8A,$0A,$D8,$07,$E4,$21,$A2,$8E,$83,$A3,$88,$8A,$CA,$FB,$E1
      Data.b $7B,$A3,$6B,$D6,$BC,$F7,$E6,$CD,$FE,$B5,$D7,$B3
      iVector:
      Data.b $08,$0C,$96,$48,$33,$51,$35,$80,$0C,$A9,$42,$1E,$11,$E0,$83,$C7,$C4,$C6,$E1,$E4
      Data.b $2E,$40,$81,$0A,$24,$70,$00,$10,$08,$B3,$64,$21
EndDataSection

; 
; Epb 
Dans la procédure decode il y a la ligne

Code : Tout sélectionner

rawfilename$ = SaveFileRequester("Please choose a new name for the decrypted file","","",0)
que j'ai transformé en :

Code : Tout sélectionner

rawfilename$ = "licence.dat" 
je pense que la ligne initial ouvre le fichier choisi par savefilerequester mais pas celle que j'ai mise...

Yves

je vais envoyer dans le prochain message la partie de code de la routine que j'ai transformé
Yves Rossignol
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

voici le code

les #file3 et 4 sont mis en enumeration

Code : Tout sélectionner

Procedure Decode(void)
      
      chunksize = 4096
      
 ;    encfilename$ = OpenFileRequester("Please choose a file to decrypt:","","",0)
 ;     rawfilename$ = SaveFileRequester("Please choose a new name for the decrypted file","","",0)
      
      encfilename$ = "licence.enc"
      rawfilename$ = "licence.dat" 

      
      If ReadFile(#file3, encfilename$)    
                  FileSeek(#file3, Lof(#file3)-4)
                  lastchunksize = ReadLong(#file3)
                  FileSeek(#file3, 0)
                  If CreateFile(#file4, rawfilename$)

                              
                              length.q = Lof(#file3)
                              numparts = length/chunksize
                              
                              *raw     = AllocateMemory(chunksize)
                              *secure  = AllocateMemory(chunksize)
                              
                              StartAESCipher(#file3, ?key, 256, ?iVector, #PB_Cipher_CBC|#PB_Cipher_Decode)
                              
                              For i=1 To numparts
                                    ReadData(#file3, *secure, chunksize)
                                    AddCipherBuffer(#file3, *secure, *raw, chunksize)
                                    If i=numparts
                                          WriteData(#file4, *raw, lastchunksize)
                                    Else
                                          WriteData(#file4, *raw, chunksize)
                                    EndIf
                                    prog.d = i/numparts*100
                                  
                                    Delay(1)
                              Next
                              
                              FinishCipher(#file3)
                        CloseFile(#file3)
                  CloseFile(#file4)
                  
                  FreeMemory(*raw)
                  FreeMemory(*secure)
            EndIf
          EndIf
          
          
EndProcedure
Yves Rossignol
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par Marc56 »

Pas le temps de tout lire, mais quelque conseils:

Mettre beaucoup de Debug pour voir ce qui se passe à chaque étape.

Afficher toujours ce que l'utilisateur a entré

Code : Tout sélectionner

rawfilename$ = OpenFileRequester("Please choose a file to encrypt:","","",0)
Debug "Fichier à ouvrir:  " + rawfilename$
Quand on fait un "if ... endif " il est recommandé de toujours mettre un else pour sortir au plus vite en cas d'échec.
Surtout dans une procédure et surtout quand la procédure est dans un Thread.
(au besoin mettre un If IsThread, KillThread)
Car dans certains cas le programme continue avec des valeur 0

Bon reflex:

Code : Tout sélectionner

If CreateFile
  ..
Else
  Debug "Erreur CreateFile"
  ProcedureReturn
EndIf
Perso, je mets même en premier la condition d'exclusion pour être sur de ne pas oublier

Code : Tout sélectionner

If Not Createfile...
  Debug "Impossible de créer le fichier"
  ProcedureReturn  ; (ou End si hors procédure)
Else
  ...
EndIf
Aussi:
- Savoir aussi qu'un SaveRequeter/OpenRequester retourne "" si l’utilisateur a annulé, donc à traiter aussi.
- Un fichier non fermé est verrouillé par le système même pour l'administrateur.
- Vérifier les \ dans les concaténation path + fichiers (certaines fonctions en mettent et pas d'autres)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par Zorro »

YvesRossignol a écrit :bonjour,je traîne une erreur depuis quelques semaines et je pense avoir trouver mon problème mais je ne suis pas certain...

voici le code initial.....

Le code a été fourni par Zorro...
rendons a césars , ce code que tu as pris ici :
http://www.purebasic.fr/french/viewtopi ... er#p185095
j'indique qu'il appartient a NetMaestro ;)

Dans la procédure decode il y a la ligne

Code : Tout sélectionner

rawfilename$ = SaveFileRequester("Please choose a new name for the decrypted file","","",0)
que j'ai transformé en :

Code : Tout sélectionner

rawfilename$ = "licence.dat" 
je pense que la ligne initial ouvre le fichier choisi par savefilerequester mais pas celle que j'ai mise...

Yves
non ça ne change rien , c'est pas a ce niveau que tu as un probleme je pense

par contre :

Code : Tout sélectionner

  If OpenFile(0, encfilename$)
au moment du openFile() , le fichier est créé s'il n'existe pas , ou ouvert et complété s'il existe deja....
un fichier deja existant, ne sera pas ecrasé par openfile() ....j'ai deja eu le cas ou mon fichier etait en fait
ecrit au debut avec les nouvelles valeurs, mais les anciennes valeurs de la version plus longue du fichier plus ancien
etaient encore presentes en fin de fichier ..

maintenant, avant les openxxx() je vérifie avec Filesize si le fichier existe deja
et je le delete avant de le recreer (avec openfile()) ... c'est plus sur :)
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

Bonjour, j'arrive très bien à travailler avec licence.enc car il est créer avant par un autre logiciel. Le problème c'est que la première fois que je "run" le programme" si licence.dat n'est pas là rien ne marche. Mais je ne peux le mettre en permanence dans le répertoire car c'est le fichier de licence décodé.

je vais essayer de mettre licence.dat vide initialement et voir ce qui se passe.

Yves
Yves Rossignol
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par Marc56 »

Je ne comprends pas tout ce que tu souhaites, mais si ça peut t'aider ?

Code : Tout sélectionner

Enumeration 
    #file3
EndEnumeration

encfilename$ = "licence.enc"

If ReadFile(#file3, encfilename$)
    Debug "Fichier licence présent"
Else
    Debug "Fichier Licence absent. Création licence de démo."
    CreateFile(#file3, encfilename$)
    WriteString(#file3, "Licence de démo")
    CloseFile(#file3)
EndIf
Par tester la présence, on entend:

Code : Tout sélectionner

Licence$ = GetHomeDirectory() + "licence.enc"

If FileSize(Licence$) = -1
    Debug "Désole, le fichier de licence n'existe pas. (" + Licence$ + ")"
    End
Else
    Debug "OK - Le fichier de licence est présent."
EndIf
Filesize retourne la taille ou -1 = n'existe pas ou -2 c'est un répertoire.

(exemples totalement opérationnels, testés)

:wink:
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

Bonjour,

je vais expliquer l'idée de base derrière cela.

Dans le logiciel welds.pb dans la procedure Register je créé un fichier nomprenom.dat qui est envoyé par courriel sur un site dont je suis le proprio. Ce récupère ce fichier, je le décode et j'en renvoi un nouveau nommé licence.enc. Dans licence.enc j'ai mis un mot supplémentaire.... l'idée c'est de comparé le fichier fait initialement et qui se nomme exemple rossignolyves.dat (nom, prenom, adresse, email, nom utilisateur, nom ordinateur, etc avec la licence que j'ai généré après que la personne a payé le logiciel sans cela il ne fonctionne pas. Mais pour pouvoir comparé je dois décodé le fichier licence et le mettre en caractère lisible... c'est pour cela que je décode licence.enc en licence.dat (qui devrait être temporaire)... ensuite si un jour cela fonctionne je vais décodé le fichier initial nomprenom.dat (qui est dans le répertoire de l'utilisateur) et faire un autre fichier temporaire...

donc...

initialement

dans welds.pb .... procedure register ==== l'utilisateur fait "nomprenom.dat" (encodé) que le soft envoi chez moi...
je prends mon gestionnaire de licence
je decode (même routine mais elle, elle marche... dans un petit programme)
je fais un fichier lisible (ascii ou autre) qui se nomme licence.dat...facilement lisible par tous... ce que je ne veux pas...
je crée une licence encodé "licence.enc" que j'envoi à l'utilisateur avec son courriel.
avec ce fichier que l'utilisateur copie dans le même répertoire que welds.pb (welds.exe en fait) on peut démarrer le logiciel... (du moins j'espère...)
lors du démarrage je refais un fichier lisible que j'ai aussi appellé "licence.dat" (j'ai essayé qwerty.dat ou nimportequoi.dat et ça marche pas)

mon bug c'est que si licence.dat décodé initial que j'ai fait avec mon gestionnaire (lisible en beau caratère ascii... je vous le rappelle) n'est pas dans le répertoire du logiciel, rien ne marche. si je mets licence.dat vide, ça marche pas...
finalement je fais tout cela pour rien...

je sais c'est pas très clair....

merci quand même

je remets une copie complète dans une dropbox.

https://www.dropbox.com/sh/lf8kkj6kx5km ... MnaGa?dl=0

c'est un fichier zip.... je vais changer la séquence des données d'encryptage quand ça va marcher... et le mot de passe

Yves
Yves Rossignol
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

faire attention la datasection est maintenant

Code : Tout sélectionner

 DataSection
      key:
      Data.b $8A,$15,$51,$2C,$0C,$8A,$0A,$D8,$07,$E4,$21,$A2,$8E,$83,$A3,$88,$8A,$CA,$FB,$E1
      Data.b $7C,$A3,$6B,$D6,$BC,$F7,$E6,$CD,$FE,$B5,$D7,$B3
      iVector:
      Data.b $07,$0C,$96,$48,$33,$51,$35,$80,$0C,$A9,$42,$1E,$11,$E0,$83,$C7,$C4,$C6,$E1,$E4
      Data.b $2C,$40,$81,$0A,$24,$70,$00,$10,$08,$B3,$64,$21
EndDataSection
au lieu de celle initiale que Zorro a trouver sur le forum anglais

Yves
Yves Rossignol
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

Bonsoir, (il est 21h heure du Québec)

J'AI TROUVE!!!!!

en remplacant readfile par openfile

en mettant getcurrentdirectory devant chaque nom de fichier à lire ou à écrire...

MERCI pour vos conseils....

Yves
Yves Rossignol
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

Finalement ça ne marche pas plus, je suis là et las! Je cherche, je change des choses, mais le système ne réagit pas comme je veux...

j'ai mis sur une dropbox le code et ses dépendances....

https://www.dropbox.com/sh/dont9tb9roam ... -E0pa?dl=0

bon... expliquons ce que je veux...

la seule différence entre welds.pb et welds2.pb c'est que dans le 2... les messagesrequester sont enlevés... le 2 marche pas mais le 1 oui....

si le fichier licence.enc est là....

avec welds.... je recois des messages et tout passe.... enfin je crois.... mais pas certain....
avec welds2 même si le fichier licence.enc est là... je reste en mode demo.... il faut aller après l'écran "disclamer" pour le voir.

si le fichier licence.enc est manquant....

welds fonctionne bien mais par la suite si j'ajoute le fichier licence.enc... ca ne marche pas toujours...
welds2 également...

en fait je veux que si le fichier de licence.enc est absent on soit en demo...
on voit passer un fichier licence.dat de 0K ou 1K ... 1K pendant l'execution (c'est normal) c'est avec les messagerequester... et 0K c'est sans.... on dirait qu'il passe tout droit....

svp aidez moi je suis pret à payer si il le faut car c'est ce qui me reste à faire et deux petits bugs....

Yves :oops: :? :( :cry:
Yves Rossignol
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par Ollivier »

yes a écrit :svp aidez moi je suis pret à payer si il le faut car c'est ce qui me reste à faire et deux
petits bugs...
Mais qu'est-ce qui se passe dans l'espace! Tu ne vas pas payer voyons!

Attends je regarde ton sujet... Je reviens...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par Ollivier »

Ok

1) Marc56 t'a demandé d'utiliser FileSize() et t'a expliqué son fonctionnement (ce que ça retourne et pourquoi ça retoune ça)

>> Qu'est-ce que ça retourne ?

Si tu comprends pas bien comment répondre, en fait tu insères :

Code : Tout sélectionner

pif = FileSize(fichier$)
debug pif
end
juste après ta modif de remplacement de SaveFileRequester() dans ta procedure "Decode()".

/!\ Tu mets bien RawFileMachin à la place de Fichier$.

Même si tu as -1 (pas de fichier), tu m'indiques que tu as -1. Si tu rajoutes un GetHomeDirectory() ou un GetCurrentDirectory(), tu me l'indiques.

C'est important que tu passes au peigne fin nos suggestions, et si une seule de nos phrases n'est pas comprise, tu la cites et tu indiques "Comprends pas ça!"

C'est important...

2) Quelle version de PB
3) Quel OS?
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

pure basic 5.42
windows 7
Yves Rossignol
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

windows 7 professionel service pack 1
Yves Rossignol
YvesRossignol
Messages : 133
Inscription : lun. 28/mars/2016 19:09

Re: problème de fichier ouvert, mal ouvert, pas ouvert...

Message par YvesRossignol »

Mais vous savez... ça n'explique pas pourquoi ça marche avec des "messagerequester" dans le code et que quand je les enlève ça ne marche plus...

Yves
Yves Rossignol
Répondre