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 :

Quel est le bon choix


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Quel est le bon choix
    Bonjour à toutes et à tous

    Suite à des erreurs aléatoire IO 103, je recherche le meilleur moyen de les éviter.

    Initialement j'avais 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    //...
      InfoCompteurLigne(StrToIntDef(StringGridLignesDocument.Cells[10,i],1));
    //...
     
    function InfoCompteurLigne(Nbr: Integer): String;
    Var
      F: TextFile;
      Fichier: String;
      Str: String;
      Valeur: Integer;
    begin
      Fichier := FichierCompteurLigne + FormatDateTime(' dd_mm_yy',Date)+'.txt';
      Valeur := 0;
      AssignFile(F,Fichier);
     
      if FileExists(Fichier) then
      begin
        Reset(F);
        Readln(F,Str);
        Valeur := StrToIntDef(Str,0);
      end;
      Valeur := Valeur + Nbr;
     
      Try
        Rewrite(F);
        WriteLn(F,IntToStr(Valeur));
      Finally
        CloseFile(F);
      end;
    end;
    Temporaire j'ai fait ceci (le but étant d'éviter l'apparition de l'erreur) "bidouille"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      Try
        InfoCompteurLigne(StrToIntDef(StringGridLignesDocument.Cells[10,i],1));
      Except
        // Pas de message inutile
      End;

    Voilà ce que je compte mettre en place désormais

    Choix 1
    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
    46
    47
     
    function InfoCompteurLigne(Nbr: Integer): String;
    Var
      F: TextFile;
      Fichier: String;
      Str: String;
      Valeur: Integer;
    begin
      Fichier := FichierCompteurLigne + FormatDateTime(' dd_mm_yy',Date)+'.txt';
      Valeur := 0;
      AssignFile(F,Fichier);
      {$I-}
      Reset(F);
      {$I+}
      if IoResult=0 then
      begin
        {$I-}
        Reset(F);
        {$I+}
        if IoResult=0 then
        begin
          {$I-}
          Readln(F,Str);
          {$I+}
        end;
        Valeur := StrToIntDef(Str,0);
      end;
     
      Valeur := Valeur + Nbr;
     
      {$I-}
      Rewrite(F);
      {$I+}
      if IoResult=0 then
      begin
        {$I-}
         WriteLn(F,IntToStr(Valeur));
        {$I+}
      end;
     
      if IoResult=0 then
      begin
        {$I-}
        CloseFile(F);
        {$I+}
      end;
    end;
    Choix 2
    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
     
    function InfoCompteurLigne(Nbr: Integer): String;
    Var
      F: TextFile;
      Fichier: String;
      Str: String;
      Valeur: Integer;
    begin
      Fichier := FichierCompteurLigne + FormatDateTime(' dd_mm_yy',Date)+'.txt';
      Try
        Valeur := 0;
        AssignFile(F,Fichier);
     
        Reset(F);
        Readln(F,Str);
        Valeur := StrToIntDef(Str,0);
     
        Valeur := Valeur + Nbr;
        Rewrite(F);
        WriteLn(F,IntToStr(Valeur));
        CloseFile(F);
      Except
     
      end;
    end;
    pour info :
    FichierCompteurLigne est un chemin réseau


    Merci à vous pour votre grain de sel

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    hello

    trapper des exceptions sans les traiter, c'est mal

    quel était ton objectif de départ ?
    y a-t-il plusieurs programmes qui accèdent au même fichier ? en même temps ?
    quelle version de Delphi utilises-tu ?
    sur quel OS est hébergé le fichier du compteur ?

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    as tu pensé à fermer le fichier avant de le réouvrir ?

    pour ma part je ferai 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function TForm1.InfoCompteurLigne(Nbr: Integer): String;
    Var
      F: TextFile;
      Fichier: String;
      Str: String;
      Valeur: Integer;
    begin
      Fichier := 'toto.txt';
      Valeur := 0;
      if FileExists(Fichier) then
      begin
        AssignFile(F,Fichier);
        Reset(F);
        Readln(F,Str);
        Valeur := StrToIntDef(Str,0);
        CloseFile(F);
      end;
      Valeur := Valeur + Nbr;
      AssignFile(F,Fichier);
      Rewrite(F);
      WriteLn(F,IntToStr(Valeur));
      CloseFile(F);
    end;
    Avec ce code je n'ai pas l'erreur I/O 103

    A+
    Charly

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Comme Charly910, ce qui m'a fait tiquer dans le premier code c'est que l'existence du fichier était testée après son ouverture
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Oui, ça marche mieux en rectifiant !

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonjour Pprem

    Citation Envoyé par pprem Voir le message
    hello

    trapper des exceptions sans les traiter, c'est mal

    quel était ton objectif de départ ?
    y a-t-il plusieurs programmes qui accèdent au même fichier ? en même temps ?
    quelle version de Delphi utilises-tu ?
    sur quel OS est hébergé le fichier du compteur ?
    Comme je le disais "bidouille" temporaire et je suis d'accord.. pas bien.. pas bien..

    - Pour te répondre :
    J'ai 3 tablettes surface Windows 10 Pro, chacune scanne des codes à chaque scanne j'utilise cette fonctionne qui alimente donc un compteur de scanne envoyer sur un répertoire réseau commun.
    Sur la tablette principal j'ai un timer qui lit ces 3 fichiers toutes les 2 secondes et j'affiche "en quelque sorte" le résultat de ce calcul
    (Valeur total Départ - valeur compteur tablette 1- valeur compteur Tablette 2 - valeur compteur Tablette 3)

    Version : Delphi D2009

    L'erreur est aléatoire et viens je pense d'un accès trop rapide.

    Salut Charly,

    Citation Envoyé par Charly910 Voir le message
    Oui, ça marche mieux en rectifiant !
    Dans ta proposition tu propose de faire un close avant la fonctionne rewrite, cas si FileExiste je n'y avais pas pensé.
    Pour le AssignFile(F,Fichier); je comprends pas cela n'ouvre pas le fichier ?


    Salut Serge ,

    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Comme Charly910, ce qui m'a fait tiquer dans le premier code c'est que l'existence du fichier était testée après son ouverture
    AssignFile(F,Fichier); n'ouvre pas le fichier ?

    D’ailleurs comme je le signalais l'erreur est aléatoire, elle arrive lorsque le traitement est trop rapide cette fonctionne peut-être appelée toutes les demi-sec voir moins parfois (selon ce que fait l'utilisateur).

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    je crois quand même que tu devrais rectifier le code :

    - AssignFile après le FileExists
    - CloseFile avant de réouvrir en Rewrite

    Après si ça plante en I/O 103 il faudra chercher d'autres causes (et tu peux évidement ajouter des {$I-} et des Try Except en tant que besoin)

    Peut être que le fichier est verrouillé par un autre processus ou bien qu'il n'est pas encore complètement écrit sur le disque quand tu veux l'ouvrir ?

    A+
    Charly

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Bonjour,

    ....
    Peut être que le fichier est verrouillé par un autre processus ou bien qu'il n'est pas encore complètement écrit sur le disque quand tu veux l'ouvrir ?

    A+
    Charly
    C'est surement ce cas qui se produit..., parfois lors de la lecture des 3 fichiers, l'écriture en même temps doit gêner !

    Mais, je ne pensais pas que juste la lecture d'un autre poste, bloquerai l’écriture du poste qui est seul destiné à écrire.
    Pourtant si on ouvre un fichier txt via le bloc-note en réseau depuis un poste et qu'on l'ouvre sur un autre en modifiant son contenu cela ne gène en rien celui où il est lu !
    Bref je me demande en fait si c'est bien ça...

    Je vais sanctuariser la lecture comme tu l'as évoqué je verrai bien d'ici 2 semaines si la Peugeot #103 reviens

    Merci

  9. #9
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    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 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    j'ai une vieille fonction qui teste l'état d'un fichier avec IOResult . Je ne sais pas si cela fonctionne en réseau :

    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
    46
    47
    48
    49
    50
    { ============================================================================== }
    function FichierOuvert(NomFichier : string; Var CodeRetour:Integer):Boolean;
    //Test si un fichier est ouvert ou indisponible
    // CodeRetour = 0 pas ouvert - 32 : violation de partage - sinon autre erreur
    {
            2: writeln('File not found');
            3: writeln('Path not found');
            4: writeln('Too many open files');
            5: writeln('File access denied');
          100: writeln('Disk read error');
          101: writeln('Disk write error');
          150: writeln('Disk is write protected');
          152: writeln('Drive is not ready');
          154: writeln('CRC error in data');
          156: writeln('Disk seek error');
          157: writeln('Unknown media type');
          162: writeln('Hardware failure');
          else writeln('Various error');
     
    et aussi :
    12   Invalid file-access mode.
    15   Invalid disk number.
    16   Cannot remove current directory.
    17   Cannot rename across volumes.
     
    }
     
    Var
       F:TextFile;
       MessErreur : String ;
    Begin
      FichierOuvert := False ;
      AssignFile(F, NomFichier);
      {$I-}
      Reset(F);
      {$I+}
      CodeRetour := IOResult;
     
      case CodeRetour of
        0 : FichierOuvert := True  ; //Pas ouvert ou en lecture seule
        32: FichierOuvert := False ; //Ouvert en écriture ou exclusif  - violation de partage
        else
          Begin
    //         FichierOuvert := False ;    // éventuellement
             MessErreur := Format('Erreur d''ouverture du fichier %s %s Erreur n° : %d', [NomFichier, RC, CodeRetour]);
    //         MessageDlg(MessErreur, mtError, [mbOk], 0);  // éventuellement
          End ;
      end;
    End;
    { ============================================================================== }
    A+
    Charly

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par BuzzLeclaire Voir le message
    AssignFile(F,Fichier); n'ouvre pas le fichier ?
    je lis dans l'aide
    In both cases, when the file is opened by Append, Reset or ReWrite
    donc, non cela n'ouvre pas le fichier par contre le Rewrite le crée
    néanmoins il faudrait peut être le jouer plus finement en utilisant FileOpen
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Et que se passe t'il si les 2 tablettes mettent a jour le fichier en meme temps ?
    tab1 lit 5
    tab2 lit 5
    tab1 ecrit 5+3, le fichier contient 8
    tab2 ecrit 5+2, le fichier contient 7, au lieu de 10

    As tu pensé à un petit systeme simple de base de données ? c'est je pense assez simple a mettre en place avec un sqlite ou access. Et ca te permet de gérer les accès concurrents.

  12. #12
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    CC serge,

    Je vais changer de mode de fonctionnement. (ton lien ne fonctionnement pas)


    Salut Bob l'éponge,

    Citation Envoyé par guillemouze Voir le message
    Et que se passe t'il si les 2 tablettes mettent a jour le fichier en meme temps ?
    tab1 lit 5
    tab2 lit 5
    tab1 ecrit 5+3, le fichier contient 8
    tab2 ecrit 5+2, le fichier contient 7, au lieu de 10

    As tu pensé à un petit systeme simple de base de données ? c'est je pense assez simple a mettre en place avec un sqlite ou access. Et ca te permet de gérer les accès concurrents.

    Chaque tablette gère son propre fichier en écriture. Une tablette gère uniquement en lecture les 3 fichiers pour afficher un calcul.
    Donc je penses que lors de la lecture, le fichier n'est pas dispo pour l'écriture ou vice-versa.

    Sinon comme je l'évoquais, je vais donc changer de fonctionnement car je vais devoir faire fonctionner 2 autres tablettes donc il y aura 5 tablettes Surface en tout dont une mère. Les 5 doivent générer un compteur et la tablette mère afficher le résultat d'un calcul.

    Je vais écrire le fichier avec le compteur en local sur chaque tablette, à l'issu je copie ce fichier vers l'UNC du serveur uniquement si le fichiers n'existe pas.
    Pour la lecture depuis la tablette mère du chemin UNC serveur, je vais lire les fichiers et les supprimer après lecture.

    La je pense plus avoir de problème....

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut


    pourquoi ne pas utiliser les tstream ... en lieu et place des ancien accès fichier
    qui sont de plus lié a la plateforme
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/03/2010, 15h58
  2. Quel est le bon usage des fichiers "*.bpk" ?!
    Par bnadem35 dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/09/2006, 17h31
  3. [PostgreSQL-Firebird/Interbase6]Quel est le meilleur choix?
    Par kedare dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 28/03/2006, 16h30
  4. Une table ou deux - quel est le meilleur choix
    Par DG dans le forum Débuter
    Réponses: 3
    Dernier message: 09/03/2006, 18h04
  5. SDBD "Gratuit" : Quel est le meilleur choix ?
    Par ZZZzzz2 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 30/03/2005, 15h25

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