IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 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.
Avatar de 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
Modérateur https://www.developpez.com
Le 14/01/2020 à 14:16
essaye const au lieu de type
Avatar de 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
Membre expert 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
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
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
Membre expert 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
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
Membre actif 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.