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

 Delphi Discussion :

Erreur d'E/S avec des fichiers texte partagés, comment l'éviter ?


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Erreur d'E/S avec des fichiers texte partagés, comment l'éviter ?
    Bonjour,

    J'ai développé deux programmes qui utilisent un répertoire commun pour s'échanger des informations via des fichiers texte.

    Le problème qui se pose, c'est que parfois, j'ai des erreurs E/S lorsqu'un fichier est en cours d'écriture par le premier programme et que le second programme essaie de le lire puis de le supprimer.

    Ci-dessous le code qui écrit le fichier :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    procedure TMain.FormCreate(Sender: TObject);
    var
         Ini            : TIniFile;
         Repertoire     : string;
         Fichier        : TextFile;
         PathFichier    : string;
    begin
         if ParamCount = 2 then
         begin
              try
                   Log(ParamStr(1) + ' ' + ParamStr(2));
                   Ini := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
                   Repertoire := Ini.ReadString('General', 'RepertoireTicket', 'C:\');
                   Ini.Free;
                   PathFichier := Repertoire + FormatDateTime('yyyymmddhhnnsszzz',Now()) + '.txt';
                   AssignFile(Fichier, PathFichier);
                   if FileExists(PathFichier) then
                        Append(Fichier)
                   else
                        Rewrite(Fichier);
                   WriteLn(Fichier, ParamStr(1) + ' ' + ParamStr(2));
                   CloseFile(Fichier);
                   Application.Terminate;
              except
                   on E : Exception do
                   begin
                        Log(E.Message);
                        Application.Terminate;
                   end;
              end;
         end
         else
              Application.Terminate;
    end;
    Ci-dessous le code qui lit le fichier puis le supprime :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    procedure TMain.Timer1Timer(Sender: TObject);
    var
         SR        : TSearchRec;
         Fichier   : TextFile;
         Ligne     : string;
    begin
         Timer1.Enabled := false;
         if IdTCPClient1.Connected then
         begin
              if FindFirst(ExtractFilePath(Application.ExeName) + 'Tickets\*.txt', faAnyFile, SR)=0 then
              begin
                   repeat
                        AssignFile(Fichier, ExtractFilePath(Application.ExeName) + 'Tickets\' + SR.FindData.cFileName);
                        Reset(Fichier);
                        case IOResult of
                             0 :
                             begin
                                  while not EOF(Fichier) do
                                  begin
                                       ReadLn(Fichier,Ligne);
                                       IdTCPClient1.IOHandler.WriteLn(Ligne);
                                       Log(Format('Envoi du ticket %s : %s',[SR.FindData.cFileName, Ligne]));
                                  end;
                                  CloseFile(Fichier);
                                  DeleteFile(ExtractFilePath(Application.ExeName) + 'Tickets\' + SR.FindData.cFileName);
                             end;
                        end;
                   until FindNext(SR) <> 0;
                   FindClose(SR);
              end;
         end
         else
         begin
              Log(Format('Tentative de connexion au serveur TCP : %s/%d (TimeOut : %d)',[IdTCPClient1.Host, IdTCPClient1.Port, IdTCPClient1.ConnectTimeout]));
              try
                   IdTCPClient1.Connect;
              except
                   on E : Exception do
                   begin
                        Log(E.Message);
                   end;
              end;
         end;
         Timer1.Enabled := true;
    end;
    Savez-vous ce que je dois faire pour éviter ce genre d'erreur ?

    Merci,
    ZiP

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour,

    Peux tu tester cette méthode :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    Var F:TextFile;
    begin
      // Sélection du fichier
      If Not OpenDialog1.Execute Then Exit;
     
      // Test du fichier
      AssignFile(F,OpenDialog1.FileName);
      {$I-}
      Reset(F);
      {$I+}
      Case IOResult Of
        // Pas d'erreur
        0 :Begin
             CloseFile(F);
             ShowMessage('Le fichier existe et n''est pas ouvert.');
           End;
        // L'erreur 32 est une violation de partage
        32:ShowMessage('Le fichier est déjà ouvert.');
      Else
        // Autre erreur
        ShowMessage('Erreur '+IntToStr(IOResult));
      End;
    end;
    A+

    Charly

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    J'ai effectué les modifications avec {$I-} et {$I+}.

    Ça semble fonctionner !

    Merci,
    ZiP

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

Discussions similaires

  1. Connexion avec des fichiers texte
    Par stum32 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 08/07/2015, 09h34
  2. Generer des fichiers text avec un codage unix
    Par proDZ dans le forum Général Java
    Réponses: 10
    Dernier message: 04/09/2009, 13h23
  3. Erreur E/S 105 lors d'ecriture avec un fichier text
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 20/02/2009, 11h29
  4. ouvrir fichier .txt dans excel avec des champs texte
    Par rom05 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 06/05/2008, 18h27
  5. Réponses: 11
    Dernier message: 14/03/2007, 14h39

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