Page 1 sur 1

[OK] Incompréhension entre Openfile, ReadFile, MD5FileFinger

Publié : sam. 11/oct./2014 13:41
par Naheulf
Je ne comprend pas pourquoi MD5FileFingerprint fonctionne la deuxième fois ... alors que pour la première ça ne veut pas ...

Code : Tout sélectionner

fichier.s = "./instant.txt"
Debug FileSize(fichier)

file = OpenFile(#PB_Any,fichier,#PB_File_Append | #PB_File_SharedRead)
If file
    Debug "md5 : " + MD5FileFingerprint(fichier)
EndIf
CloseFile(file)

file = ReadFile(#PB_Any,fichier,)
If file
    Debug "md5 : " + MD5FileFingerprint(fichier)
EndIf
CloseFile(file)

Re: Incompréhension entre Openfile ReadFile et MD5FileFinger

Publié : sam. 11/oct./2014 14:16
par majikeyric
Bein déjà y a pas besoin d'ouvrir un fichier avec OpenFile() ou ReadFile() pour appeler la fonction MD5FileFingerprint().

Re: Incompréhension entre Openfile ReadFile et MD5FileFinger

Publié : sam. 11/oct./2014 14:36
par Naheulf
En fait c'est par ce que dans mon code je me suis retrouvé à un moment à vouloir utiliser MD5FileFingerprint() sur un fichier que j'avais ouvert par ailleurs dans mon code. Et c'est en testant que je me suis rendu compte de ce comportement.

Ce code est juste un résumé de ce que j'ai expérimenté.

Re: Incompréhension entre Openfile ReadFile et MD5FileFinger

Publié : sam. 11/oct./2014 15:07
par nico
La fonction ne semble pas fonctionner lorsque le fichier est déjà ouvert par le programme en accès écriture, peut être un problème de gestion interne à PB, faudrait voir avec Fred si c'est normal.

Re: Incompréhension entre Openfile ReadFile et MD5FileFinger

Publié : sam. 11/oct./2014 15:22
par Ar-S
Extrait de la doc
Pour que l'ouverture du fichier avec OpenFile() soit un succès, le fichier doit avoir les droits en lecture et écriture. Ceci peut devenir un problème si il faut manipuler des fichiers sur un CD-Rom par exemple. Dans ce cas, il convient d'utiliser ReadFile() quand seule la lecture du fichier est nécessaire.
Théorie.
Je pense donc que lorsqu'on utilise OpenFile le fichier doit être considéré comme "en cours d'utilisation" et pas avec readfile().

D'ailleurs je le démontre ici : (re-modifie ton chemin ligne 1)

Code : Tout sélectionner

fichier.s = "E:\MULTIMEDIA\PUREBASIC\5.30\test_list.pb"
Taille =  FileSize(fichier)
OK = 0

file = OpenFile(#PB_Any,fichier,#PB_File_Append | #PB_File_SharedRead)
If file <> 0 And Taille > 0
    OK=1
    Else
    OK = 0
EndIf
CloseFile(file)

; Comme mon fichier est fermé, la commande MD5 va marcher.
If OK = 1
	Debug "Version OPENFILE - md5 : " + MD5FileFingerprint(fichier)

file = ReadFile(#PB_Any,fichier)
Debug "Version READFILE - md5 : " + MD5FileFingerprint(fichier)
CloseFile(file)
	
EndIf
Mais comme l'a dit majikeyric, MD5FileFingerprint se suffit à lui même. ça évite justement plusieurs accès à un fichier déjà "ouvert".

Re: Incompréhension entre Openfile ReadFile et MD5FileFinger

Publié : sam. 11/oct./2014 16:11
par nico
Après quelques tests, voici l'explication:

La fonction MD5FileFingerprint ouvre le fichier spécifié avec l'argument FILE_SHARE_READ mais pas avec l'argument FILE_SHARE_WRITE, ceci expliquant les tests précédents, ce qui signifie aussi que si le fichier est ouvert par un autre processus en écriture, la fonction échouera.

Extrait doc MSDN:
FILE_SHARE_WRITE
0x00000002
Permet les opérations d'ouverture suivantes sur un fichier ou un dispositif de demande d'accès en écriture.
Sinon, d'autres processus ne peuvent pas ouvrir le fichier ou périphérique s'ils demandent un accès en écriture.
Si cette option n'est pas spécifiée, mais le fichier ou le dispositif a été ouvert pour un accès en écriture ou a un mappage de fichiers avec un accès en écriture, la fonction échoue.

Re: Incompréhension entre Openfile ReadFile et MD5FileFinger

Publié : sam. 11/oct./2014 16:49
par Naheulf
D'accord .... bon et ben merci :D je met le topic en résolu

Edit : on fait comment pour passer un topic en résolu ?

Re: Incompréhension entre Openfile ReadFile et MD5FileFinger

Publié : sam. 11/oct./2014 18:46
par Ar-S
Tu édites ton premier message et tu ajoutes [RESOLU] ou [OK] devant ton titre.