IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Detecter fichier déjà utilisé par autre application


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut Detecter fichier déjà utilisé par autre application
    Bonsoir,

    Comment faire pour détecter qu'un fichier (de n'importe quel type) est déjà utilisé par une autre application ?

    Je vois bien CreateFile (ou CreateFileA... la différence entre les deux m'échappant) mais la multitude d'attributs ne rend pas la chose facile !

    Quelqu'un peut-il m'aider à y voir plus clair ?

    Merci d'avance
    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Je ne sais pas si c'est la meilleure solution mais j'ai trouvé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    Var F:TextFile;
    begin
      AssignFile(F,'C:\temp\essai.doc');
      {$I-}
      Reset(F);
      {$I+}
      Case IOResult Of
        0 :CloseFile(F);
        32:ShowMessage('Le fichier est déjà ouvert.');
      Else
        ShowMessage('Erreur '+IntToStr(IOResult));
      End;
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 965
    Points
    6 965
    Par défaut
    Sinon, j'ai lu ca quelque part (jamais testé ):
    Utilise l'API windows OpenFile en mode OF_SHARE_EXCLUSIVE. Si ça échoue, le fichier est déjà ouvert !
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 129
    Points
    129
    Par défaut
    OpenFile n'est là que pour la compatibilité 16 bits. Il faut utiliser la fonction CreateFile . Je propose (sans l'avoir vérifié) l'appel suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var h : Thandle;
    h := CreateFile(PChar(Nom_du_fichier), 
             GENERIC_READ or GENERIC_WRITE,  // accès en écriture possible ?
             FILE_SHARE_READ or FILE_SHARE_WRITE, 
             nil, 
             OPEN_EXISTING,   // on veut ouvrir et non créer
             FILE_ATTRIBUTE_NORMAL, 
             0); 
    if h = INVALID_HANDLE_VALUE then showmessage ('fonction déjà utilisée');
    Normalement, si une application utilise déjà le fichier en écriture, la fonction ci-dessus devrait échouer .......

    A+
    Consultez :
    - La F.A.Q Delphi + Les Cours Delphi
    - La sélection des Freewares Delphi

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Merci à tous !

    J'essaie ta solution ce soir, Delphi-fan, et je reviendrai sur ce message pour l'enrichir ou le 'résoudre'...

    Cordialement,
    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    (re)bonjour,

    J'ai fait un test simple en ouvrant un fichier (todel2.txt) avec notepad... mais le createfile ne me remonte pas le fait que le fichier est déjà ouvert... peut-être un problème de paramètres ? En tous cas je ne trouve pas la solution !

    Help encore !

    Merci d'avance,
    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Notepad est un mauvais exemple, car il ne vérrouille pas le fichier. Une fois que le fichier est lu, il est refermé. Il est donc possible de l'ouvrir avec une autre application ou de le renommer.

    Essaye avec Word ou Excel.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    OK ! Merci à tous pour vos réponses. Je joins ci-dessous un code qui marche à merveille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    function FileInUse(AFile:string):Boolean;
    var
      h: Thandle;
    begin
      Result:=False;
      h:=CreateFile(PChar(AFile),
                    GENERIC_WRITE,
                    FILE_SHARE_WRITE,
                    nil,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL,
                    0);
      if h = INVALID_HANDLE_VALUE then
        begin
          Result:=True;
        end;
     
      CloseHandle(h);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if FileInUse('C:\Temp\Todel1.doc') then
        ShowMessage('Fichier en cours d''utilisation');
    end;
    Merci encore et bonne journée !
    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

  9. #9
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 129
    Points
    129
    Par défaut
    On est bien d'accord que cet appel ne fait que déduire qu'un fichier est déjà ouvert en écriture par une autre application : si cette appli l'a seulement ouvert en lecture, alors la fonction ne te le signalera pas !
    Consultez :
    - La F.A.Q Delphi + Les Cours Delphi
    - La sélection des Freewares Delphi

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 66
    Points : 45
    Points
    45
    Par défaut
    Oui.

    Merci pour cette précision... et pour ton aide.

    Drooxy
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Si la pratique et la théorie sont réunies, rien ne fonctionne et on ne sait pas pourquoi.
    (Albert Einstein)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Savoir si un fichier est utilisé par une application
    Par rambc dans le forum Général Python
    Réponses: 22
    Dernier message: 21/11/2010, 11h50
  2. Réponses: 2
    Dernier message: 06/10/2008, 17h27
  3. Réponses: 7
    Dernier message: 15/06/2007, 18h50
  4. [c#] manipuler socket utilisé par autre application
    Par orelero dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/12/2005, 09h25
  5. Réponses: 7
    Dernier message: 23/03/2005, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo