Tester si fichier déjà ouvert

Présentation
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.
Téléchargement
Compatibilité
Windows
0  0 
Téléchargé 43 fois Voir les 11 commentaires
Détails
Catégories : Gestion de fichiers
Avatar de Bruno Guérangé
Expert éminent sénior
Voir tous les téléchargements de l'auteur
Licence : Non renseignée
Date de mise en ligne : 8 février 2013




Avatar de Andnotor Andnotor - Rédacteur/Modérateur https://www.developpez.com
le 15/01/2011 à 12:50
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 !

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;
Avatar de tourlourou tourlourou - Modérateur https://www.developpez.com
le 14/01/2020 à 14:16
essaye const au lieu de type
Avatar de khayyam90 khayyam90 - Rédacteur https://www.developpez.com
le 04/01/2011 à 14:25
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 ?
Avatar de Charly910 Charly910 - Membre émérite https://www.developpez.com
le 04/01/2011 à 15:33
Bonjour,

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;
A+

Charly
Avatar de Montor Montor - Membre éprouvé https://www.developpez.com
le 14/01/2011 à 20:38
Aussi un truc de genre
Code : Sélectionner tout
GetFileAttributes(PChar(Filename))<>INVALID_FILE_ATTRIBUTES
Avatar de Jeffem Jeffem - Futur Membre du Club https://www.developpez.com
le 03/01/2020 à 11:30
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.
Avatar de Charly910 Charly910 - Membre émérite https://www.developpez.com
le 04/01/2020 à 10:05
Bonjour,
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
Avatar de ShaiLeTroll ShaiLeTroll - Expert éminent sénior https://www.developpez.com
le 13/01/2020 à 11:27
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 !
Avatar de oneDev oneDev - Membre régulier https://www.developpez.com
le 14/01/2020 à 11:27
Bonjour,

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;
J'ai les erreurs suivantes :

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)
Je ne vois pas comment corriger le code.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.