Téléchargé 7 fois
Vote des utilisateurs
0
0
Détails
Licence : Non renseignée
Mise en ligne le 8 février 2013
Plate-forme :
Windows
Langue : Français
Référencé dans
Navigation
Tester si fichier déjà ouvert
Tester si fichier déjà ouvert
Tester si un fichier est déjà ouvert par une autre application.NOTES : Le principe de détection est basé sur un essai d'ouverture et le test du code d'erreur 32 indiquant une violation de partage.
Ce code ne dit pas que le fichier est déjà ouvert, mais qu'il peut l'être en écriture
Un fichier ouvert en lecture ne sera pas détecté, à moins qu'il l'ait été en mode exclusif (fmShareExclusive).
A noter aussi que Reset ne renvoi pas d'erreur sur un fichier ouvert en mode fmOpenRead or fmShareDenyWrite (Par contre Write se plante normalement !)
Enfin une erreur autant dans le code de Nono40 que dans celui de Charly910 (mais en pire puisque le case ne fonctionne plus du tout) : IOResult ne peut être lu qu'une seule fois. Il est reseté après le premier appel !
Un fichier ouvert en lecture ne sera pas détecté, à moins qu'il l'ait été en mode exclusif (fmShareExclusive).
A noter aussi que Reset ne renvoi pas d'erreur sur un fichier ouvert en mode fmOpenRead or fmShareDenyWrite (Par contre Write se plante normalement !)
Enfin une erreur autant dans le code de Nono40 que dans celui de Charly910 (mais en pire puisque le case ne fonctionne plus du tout) : IOResult ne peut être lu qu'une seule fois. Il est reseté après le premier appel !
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var F :TextFile; IORes :integer; begin AssignFile(F, NomFichier); {$I-} Reset(F); {$I+} IORes := IOResult; case IORes of 0 :; //Pas ouvert ou en lecture seule 32:; //Ouvert en écriture ou exclusif else ShowMessage('Erreur ' +IntToStr(IORes)); end; end; |
essaye const au lieu de type
Bonjour,
Je vous propose un nouvel élément à utiliser : [Delphi]Tester si fichier déjà ouvert
Tester si un fichier est déjà ouvert par une autre application.
NOTES : Le principe de détection est basé sur un essai d'ouverture et le test du code d'erreur 32 indiquant une violation de partage.
Qu'en pensez-vous ?
Je vous propose un nouvel élément à utiliser : [Delphi]Tester si fichier déjà ouvert
Tester si un fichier est déjà ouvert par une autre application.
NOTES : Le principe de détection est basé sur un essai d'ouverture et le test du code d'erreur 32 indiquant une violation de partage.
Qu'en pensez-vous ?
Bonjour,
Pour ma part, j'utilise cette fonction (qui peut surement être perfectionnée) :
A+
Charly
Pour ma part, j'utilise cette fonction (qui peut surement être perfectionnée) :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | { ============================================================================== } function FichierOuvert(NomFichier : string; CodeRetour:Integer):Boolean; //Test si un fichier est ouvert ou indisponible // CodeRetour = 0 pas ouvert - 32 : violation de partage - sinon autre erreur Var F:TextFile; begin FichierOuvert := True ; // Test du fichier AssignFile(F,NomFichier); {$I-} Reset(F); {$I+} CodeRetour := IOResult ; Case IOResult Of // Pas d'erreur 0 :Begin CloseFile(F); FichierOuvert := False ; // ShowMessage('Le fichier existe et n''est pas ouvert.'); End; // L'erreur 32 est une violation de partage 32: Begin // ShowMessage('Le fichier est déjà ouvert.'); End ; Else // Autre erreur // ShowMessage('Erreur '+IntToStr(IOResult)); End; End; |
Charly
Aussi un truc de genre
Code : | Sélectionner tout |
GetFileAttributes(PChar(Filename))<>INVALID_FILE_ATTRIBUTES
Dans la proposition de Dr.Who, je suggère d'initialiser result à 0 lorsque le fichier existe. Sinon, result s'incrémente à chaque appel de la fonction.
Bonjour,
c'est impossible. En voici la preuve :
I n'est pas incrémenté ..
A+
Charly
c'est impossible. En voici la preuve :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | procedure TF_Princ.Button3Click(Sender: TObject); Var I : Integer ; begin I := isOpenableFile('D:\DESSIN\44304.jpg') ; ShowMessage('Result : '+IntToStr(I)) ; I := isOpenableFile('D:\DESSIN\6094672.jpg') ; ShowMessage('Result : '+IntToStr(I)) ; I := isOpenableFile('D:\DESSIN\44304.jpg') ; ShowMessage('Result : '+IntToStr(I)) ; end; |
I n'est pas incrémenté ..
A+
Charly
Une exécution en DEBUG ou en RELEASE peut différencier
Result peut en RELEASE contenir une valeur aléatoire alors que c'est bcp plus rare en DEBUG
Cela dépend du contexte mémoire et peut-être même d'options du compilateur, le warning n'est pas là pour rien !
Result peut en RELEASE contenir une valeur aléatoire alors que c'est bcp plus rare en DEBUG
Cela dépend du contexte mémoire et peut-être même d'options du compilateur, le warning n'est pas là pour rien !
Bonjour,
J'ai voulu tester le code de Dr Who, avec Delphi 7.
J'ai une erreur avec le code suivant :
J'ai les erreurs suivantes :
Je ne vois pas comment corriger le code.
J'ai voulu tester le code de Dr Who, avec Delphi 7.
J'ai une erreur avec le code suivant :
Code : | Sélectionner tout |
1 2 3 4 5 6 | type foNotFound = $00; foNotReadable = $01; foNotWritable = $02; foReadable = $04; foWritable = $08; |
Code : | Sélectionner tout |
1 2 3 4 5 | [Erreur] Main.pas(11): '..' attendu(e) mais ';' trouvé(e) [Erreur] Main.pas(12): '..' attendu(e) mais ';' trouvé(e) [Erreur] Main.pas(13): '..' attendu(e) mais ';' trouvé(e) [Erreur] Main.pas(14): '..' attendu(e) mais ';' trouvé(e) [Erreur] Main.pas(15): '..' attendu(e) mais ';' trouvé(e) |
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.