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

Turbo Pascal Discussion :

[TP] Trop de fichiers ouverts : plantage


Sujet :

Turbo Pascal

  1. #1
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 36
    Par défaut [TP] Trop de fichiers ouverts : plantage
    Bonjour et bonne année à toutes et tous !

    J'ai un programme qui se met soudainement à planter suite à des regroupements de données parce que lorsque je veux les trier je passe par un fichier intermédiaire qui ne semble pas vouloir se fermer malgré le close et l'erase !
    Lorsque ça plante et que je regarde avec l'explorateur je trouve plein de fichiers tmp et donc trop comme la limite est de 255 sous XP, que pourrais je faire pour y remédier svp ? Merci d'avance pour votre aide

    Bonne continuation

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Il faut les fermer correctement, je ne vois pas d'autre solution.

    Poste le bout de code incriminé ici.

  3. #3
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Citation Envoyé par wormful_sickfoot
    Poste le bout de code incriminé ici.

    On va le blanchir ou l'acquiter!!

  4. #4
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 36
    Par défaut
    Je préfère prévenir c'est du lourd mais c'est un vieux programme ...

    Ne soyez pas trop durs merci !
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    assign(ftemp,cheminutil+'tempstat');
      {$i-}
      rewrite(ftemp);
      {$i+}
      If ioresult <> 0
      Then Begin
        affichermessage(13,'Anomalie … la création du fichier TEMPSTAT',
        'Traitement abandonné‚','',True,False);
        sortieano:=True;
      End;
      {$i-}
      close(ftemp);
      {$i+}
      If ioresult <> 0 Then;
      TypeDuCompte := Depense;
      If Not SortieAno Then
      Repeat
        listestat:=Nil;
        CleNom := CadrerIndex(Codcol,3) + ShortToKey(Ord(TypeDuCompte)) + BudgetChoisi
                +'               '+ '       ' ;
        BtClearKey(pfnom,1);
        Repeat
          BTSearchKey(pfnom,1,NoEnreg,CleNom);
        Until Not IsLockError(pfnom,True);
        If Not IsamOk Then
        Begin
          FinFichier := True;
          If IsamError=10210 then
             begin
             {$IfDef TestEur}
            { AfficheString(3,3,'Clenom='+CleNom);
             Delay(5000); }
             {$EndIf}
             Finfichier := True;
             end;
          If IsamError<>10210 Then
          Begin
            AfficherAnomalie(12,'Problème à la lecture des index du fichier COPNOM'+StExocourt,
            'Traitement abandonné‚','');
            SortieAno := True;
          End
        End Else FinFichier := False;
        While Not FinFichier do
        Begin
          Clignote:=Not Clignote;
          AfficheTraitementEnCours(21,clignote);
          Repeat
            BTGetRec(pfnom,NoEnreg,Recept.Enreg,True);
          Until Not IsLockError(pfnom,True);
          If Not IsamOk Then
          Begin
            AfficherAnomalie(12,'Problème à la lecture du fichier COPNOM'+StExoCourt,'',
            '');
            FinFichier := True;
            SortieAno := True;
          End Else
          Begin
            With Recept do
            If (Enreg.NumCol = CodCol)
            And (Enreg.TypeCompte = TypeDuCompte)
            And ((ComptaCol <> M21) Or (Enreg.Article[1] = BudgetChoisi))
            Then Begin
              With Enreg do
              Begin
                GdLivre     := ChaineDe(' ',8);
                WBP := 0; WBS := 0; WDM :=0;
                If TypeCompte = Depense
                Then Anterieur(PfGMvt,Enreg,debit,WBP,WBS,WDM);
                If TypeCompte = Recette
                Then Anterieur(PfGMvt,Enreg,credit,WBP,WBS,WDM);
                Case ComptaCol Of
                M21  :
                  Begin
                    LetReglement:=' ';
                    If Article[1] <> ' ' Then VerifierAnnexe(Article[1],LetReglement);
                    Res:=CompteAutorise(PfTab,LetReglement+Copy(Article,2,length(Article)-1),
                    GdLivre,SensDuSolde,BloquantOuNon,ZBilan);
                  End;
                M1   : Res:=CompteAutorise(PfTab,Article,GdLivre,SensDuSolde,BloquantOuNon,ZBilan);
                M2 :
                  (*If Caractiv = 'G'
                  Then Res := CompteM2AutoriseG(PfTab,Article,GdLivre,SensDuSolde,BloquantOuNon,ZBilan)
                  Else*)
    	      Res := CompteM3M4Autorise(PfTab,Article,GdLivre,SensDuSolde,BloquantOuNon,ZBilan);
                End;
                {Aucun compte n'est exclus : s'il n'est pas présent dans la nomenclature
                de référence,le compte grand Livre sera le compte détaillé}
                While Length(Article) < 16 do Article := Article + ' ';
                If ChaineVide(GdLivre) Then
                If ComptaCol = M2 Then GdLivre := Copy(Article,2,10)
                Else GdLivre := Copy(Article,1,10);
                Article:=EnleverEspacesDroits(GdLivre);
                While Length(Article) < 16 do Article := Article + ' ';
              End;
              If listestat=Nil Then
              Begin
                new(listestat);
                listestat^.tCs:=recept;;
                listestat^.Suiv:=Nil;
                listestat^.Pred:=Nil;
                dernier:=listestat;
              End Else
              Begin
                Aux:=dernier;
                {les éléments du fichier sont toujours ajoutés en fin de liste,
                sauf pour M1 où le nouvel élément peut être éventuellement
                inséré un peu avant les derniers comptes de la liste :
                dans tous les cas, il est intéressant de démarrer le balayage
                de la liste à partir de la fin}
                while (Aux<>Nil) And avant(recept,Aux^.tCs)
                do Aux:=Aux^.Pred;
                If Aux = dernier Then {fin de liste}
                Begin
                  new(dernier^.Suiv);
                  dernier^.Suiv^.Pred:=dernier;
                  dernier:=dernier^.Suiv;
                  dernier^.Suiv:=Nil;
                  dernier^.tCs:=recept;
                End Else
                If Aux = Nil Then     {d‚but de liste}
                Begin
                  new(listestat^.Pred);
                  listestat^.Pred^.Suiv:=listestat;
                  listestat:=listestat^.Pred;
                  listestat^.Pred:=Nil;
                  listestat^.tCs:=recept;
                End Else              {insertion dans la liste}
                Begin
                  new(inser);
                  inser^.Pred:= Aux;
                  inser^.Suiv:=Aux^.Suiv;
                  Aux^.Suiv^.Pred:=inser;
                  Aux^.Suiv:=inser;
                  inser^.tCs:=recept;
                End;
              End;
              Repeat
                BTNextKey(pfnom,1,NoEnreg,CleNom);
              Until Not IsLockError(pfnom,True);
              If Not IsamOk Then
              Begin
                FinFichier := True;
                If IsamError <> 10250 Then
                Begin
                  AfficherAnomalie(12,'Problème index  du fichier COPNOM'+StExoCourt,'',
                  '');
                  SortieAno := True;
                End;
              End;
            End Else FinFichier:=True;
          End;{If Not IsamOk}
        End;{While Not FinFichier}
        {fusion et tri de la liste listestat et du fichier ftri}
        If Not sortieano Then
        If existfile(cheminutil+'ftri') Then
        Begin
          assign(ftemp,cheminutil+'ftri');
          {$i-}
          rename(ftemp,cheminutil+'tempstat');
          {$i+}
          If ioresult <> 0
          Then Begin
            affichermessage(13,'Impossible de renommer le fichier TEMPSTAT',
            'Traitement abandonné ','',True,False);
            sortieano:=True;
          End;
        End;
        If Not sortieano Then
        Begin
          assign(ftri,cheminutil+'ftri');
          assign(ftemp,cheminutil+'tempstat');
          {$i-}
          rewrite(ftri);
          reset(ftemp);
          {$i+}
          If ioresult <> 0
          Then Begin
            affichermessage(13,'Anomalie à l''ouverture des fichiers FTRI et TEMPSTAT',
            'Traitement abandonné','',True,False);
            sortieano:=True;
          End Else
          Begin
            Aux:=listestat;
            fintemp:=eof(ftemp);
            fin:=fintemp And (Aux=Nil);
            If Not fintemp Then read(ftemp,fiche) Else fintemp:=True;
            While Not fin do
            Begin
              If (Aux=Nil) Or (Not fintemp And avant(fiche,Aux^.tCs))
              Then Begin
                write(ftri,fiche);
                If Not eof(ftemp) Then read(ftemp,fiche) Else fintemp:=True;
              End Else
              Begin
                write(ftri,Aux^.tCs);
                If Not fintemp And idem(fiche,Aux^.tCs) Then
                Begin
                  write(ftri,fiche);
                  If Not eof(ftemp) Then read(ftemp,fiche) Else fintemp:=True;
                End;
                Aux:=Aux^.Suiv;
              End;
              fin:=fintemp And (Aux=Nil);
            End;{While Not fin}
          End;
          {$i-}
          close(ftemp);
          erase(ftemp);
          close(ftri);
          {$i+}
          If ioresult=0 Then;
        End;
        while listestat<>Nil do
        Begin
          Aux:=listestat^.Suiv;
          Dispose(listestat);
          listestat:=Aux;
        End;
        TypeDuCompte:=Succ(TypeDuCompte);
      Until (TypeDuCompte = BalEntre) Or SortieAno;

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Fio,

    Des balises [ code] [ /code], sans les espaces qui ici ne servent qu'à les invalider, seraient utiles pour rendre le code lisible.

  6. #6
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 36
    Par défaut
    là faut peut-être pas m'en demander trop on n'est qu'en début d'année et en milieu de semaine

    surtout que je ne vois pas trop comment ça marche cette histoire de balises sorry

    y pas moyen de vous faire passer le code dans un fichier texte en pièce jointe ?

  7. #7
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    y pas moyen de vous faire passer le code dans un fichier texte en pièce jointe ?
    biensur. Regarde en haut de l' editeur quand tu es entrain de poster un message. Il y' a tout un tas de trucs : balise code-balise quote ...

  8. #8
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 043
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Je ne vois pas d'erreur de conception dans ton code qui pourrait expliquer que les fichiers temp ne s'effacent pas. Leur taille est-elle bien différente de zéro ?

    Il y a toutefois une remarque à faire au sujet de l'utilisation de la fonction IOResult : elle ne fait que renvoyer le résultat de la dernière opération d'entrée/sortie. Dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {$i-}
    close(ftemp);
    erase(ftemp);
    close(ftri);
    {$i+}
    If ioresult=0 Then;
    tu ne testes en fait que le résultat de la fermeture du fichier ftri. En testant le résultat de la fermeture de ftemp puis de sa suppression, tu devrais obtenir un code d'erreur qui t'éclaire sur le problème.

    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  9. #9
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 36
    Par défaut
    En fait seuls les fichiers vides ne sont pas considérés comme fermés et comme en début d'année les utilisateurs n'ont pas encore commencé à saisir c'est là que ça coince ! Une fois qu'ils auront pris le rythme et commencé à travailler le problème ne se posera plus, il faudrait donc arriver à neutraliser ces fichiers vides mais je n'y arrive pas
    Sinon quelqu'un aurait les codes des IO à tester pour avoir une idée précise de ce qui se passe svp ? Merci d'avance
    Bonne journée

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Fio,
    Citation Envoyé par Jeff on the web Voir le message
    En fait seuls les fichiers vides ne sont pas considérés comme fermés et comme en début d'année les utilisateurs n'ont pas encore commencé à saisir c'est là que ça coince ! Une fois qu'ils auront pris le rythme et commencé à travailler le problème ne se posera plus, il faudrait donc arriver à neutraliser ces fichiers vides mais je n'y arrive pas
    Sinon quelqu'un aurait les codes des IO à tester pour avoir une idée précise de ce qui se passe svp ? Merci d'avance
    Bonne journée
    Je n'ai pas encore regardé ton code, mais pour les valeurs à tester, l'aide est là pour ça.

  11. #11
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Pour les fichiers vides, tu peux toujours tester la taille du fichier (je crois que c'est c'est size(F), pas sûr).

  12. #12
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 36
    Par défaut
    Dans l'aide il est juste indiqué que si le code retour est à zéro l'opération s'est bien effectuée donc c'est un peu léger mais peut-être ne s'agit-t-il pas de l'aide obtenue par le Ctrl-F1

  13. #13
    Membre chevronné
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Par défaut
    Codes d'erreur DOS :

    2 : File not found
    3 : Path not found
    4 : Too many open files
    5 : File access denied
    6 : Invalid file handle
    12 : Invalid file access code
    15 : Invalid drive number
    16 : Cannot remove current directory
    17 : Cannot rename across drives

    Codes d'erreurs d'entrées/sorties :

    100 : Disk read error
    101 : Disk write error
    102 : File not assigned
    103 : File not open
    104 : File not open for imput
    105 : File not open for output
    106 : Invalid numeric format

  14. #14
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Die,
    Citation Envoyé par Jeff on the web Voir le message
    Dans l'aide il est juste indiqué que si le code retour est à zéro l'opération s'est bien effectuée donc c'est un peu léger mais peut-être ne s'agit-t-il pas de l'aide obtenue par le Ctrl-F1
    Dans l'aide, il y a une section "Runtime errors". C'est difficile d'aller voir ce qu'il y a dedans ?

  15. #15
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 36
    Par défaut
    Faudrait peut-être voir à ne pas confondre les RunTime erreurs et les messages d'erreur générés par les opérations d'E/S (Input-Output) ...
    Dans le cas présent je ne vois ce qui peut empêcher le programme de fermer les fichiers mais je vais tout de même vous retrouver le code et sa signification
    @ suivre !

  16. #16
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Woe,
    Citation Envoyé par Jeff on the web Voir le message
    Faudrait peut-être voir à ne pas confondre les RunTime erreurs et les messages d'erreur générés par les opérations d'E/S (Input-Output) ...
    Dans le cas présent je ne vois ce qui peut empêcher le programme de fermer les fichiers mais je vais tout de même vous retrouver le code et sa signification
    @ suivre !
    Pour exercice, un petit extrait des runtime Error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         2 |File not found
         3 |Path not found
         4 |Too many open files   100 │Disk read error
       101 |Disk write error
       102 |File not assigned
       103 |File not open
       104 |File not open for input
       105 |File not open for output
    etc.

Discussions similaires

  1. Parrait il que j ai trop de fichier ouvert, comment controler ceci
    Par pierrot10 dans le forum Administration système
    Réponses: 0
    Dernier message: 21/09/2009, 09h07
  2. Trop de fichiers ouverts
    Par uriotcea dans le forum C++
    Réponses: 31
    Dernier message: 29/01/2009, 17h30
  3. Trop de fichiers ouverts
    Par HASSIOMAR dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/10/2008, 16h02
  4. Pbm compilation trop de fichiers ouverts
    Par HASSIOMAR dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/10/2008, 10h39
  5. Trop de fichiers ouverts ...
    Par djidji dans le forum C
    Réponses: 4
    Dernier message: 01/12/2005, 17h15

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