Message d'erreur E/S 32 lors d'un rewrite [Résolu]

Signaler
Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2007
-
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
-
bonjours à tous,
voila j'aimerais ajouter et modifier contenu d'un fichier texte, alors pour cela je recupere tout les info qu'il y a dessus (avec un assignfile(f,'toto.txt'); reset(f); readln(f, contenu); closefile(f);

puis j'efface le fichier et je reecrit tout avec la version modifier:
assignfile(f,'toto.txt'); rewrite(f); writeln(f,'ouaiii'+contenu+'ok');  closefile(f);

truc de base mais qui pourtout m'affiche une erreur E/S 32 en me colorant la ligne où j'ai ecrit le writeln;

j'ai verifié , tout reverifié (voir si il manque un ';' ou erreur bète du meme genre on ne sait jamais), je ne vois pas pourquoi.
Quelqu'un a t'il une solution??

rq: si je reecrit le contenu dans un fichier toto(2).txt  -> plus d'erreur, allez savoir pourquoi. Je sais que il existe d'autre topics de ce type, mais ils m'aident pas plus, sauf qu'il paraiterai que ce soit un probleme que le fichier toto.txt est deja ouvert et donc ca plante.
Mais je ne vois pourquoi pourquoi ce serai ca vus que j'ai bien ecrit closefile(f);

14 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
utilise les streams si ton fichier est assé gros (> 1Mo), sinon utilise un TStringList (< 1Mo).

de plus n'oublis pas le bloc Try Finally :

AssignFile(F, FileName);
Try
  Reset(F); ou Rewrite(F);
  ....
Finally
  CloseFile(F);
end;

avec les streams c'est assé simple :

var
  TFS : TFileStream;
  S   : String;
  P   : PChar;
begin
  TFS := TFileStream.Create(FileName, fmOpenRead);
  Try
    if TFS.Size <> 0 then begin
       SetLength(S, TFS.Size);
       P := PChar(S);
       TFS.ReadBuffer(P^, TFS.Size);
    end;
  Finally
    TFS.Free;
  end;
  if (Condition) then begin
     TFS := TFileStream.Create(FileName, fmOpenWrite);
     try
       S := 'ouai '+S+' Ok';
       P := PChar(S);
       TFS.WriteBuffer(P^, Length(S));
     finally
       TFS.Free;
     end;
  end;
end;

et avec les StringList c'est encore plus simple :

var
  TSL : TStringList;
  S   : string;
begin
  TSL := TStringList.Create;
  try
    TSL.OpenFromFile(FileName);
    if TSL.Count <> 0 then begin
       S := TSL.Strings[0];
       if (condition) then begin
          TSL.Clear;
          TSL.Add('ouai '+S+' Ok');
          TSL.SaveToFile(FileName);
       end;
    end;
  finally
    TSL.Free;
  end;
end;

Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2007

merci beaucoup,
 je ne connaissai pas du tout cette technique de tout enregistrer d'un coup dans un tableau de chaines(pour ta solution 2) , de le manipuler, ....
par contre moi, ton code ne marche que si je met LoadFromFile(FileName) à la place de OpenFromFile(...).
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
oui oui c'est bien LoadFrom... et pas OpenFrom ... petit ripage memoriel.

Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2007

Sinon, y a t'il moyen de savoir pourquoi il me faisait cette erreur ?

On peut aussi utiliser {$I-} et {$I+} et ton erreur vient du fait que tu n'as pas utilisé ceci.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
{$I-} et {$I+} ne servent, respectivement, qu'à désactiver puis à activer la gestion des erreurs d'entrées sorties dans le code de l'application. Ce n'est donc pas un solution mais simplement un moyen de masquer les erreurs...

@fiascoco : ton code fonctionne parfaitement et le problème doit se situer ailleurs. Comment déclares-tu le type de fichier dans lequel tu écris ?
Es-tu sur qu'ailleurs, dans ton code, le fichier n'aurait pas déjà été ouvert ?
Le fichier toto.txt ne serait-il pas resté ouvert lors d'un plantage précédent ?

May Delphi be with you !





<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Salut,

Delphi avait vu juste (comme très souvant d'ailleurs)

erreur E/S 32 :=    Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus

Message obtenu avec :
      ShowMessage(SysErrorMessage(GetLastError));

@+
Cirec

<hr size ="2" />
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
ps : readln(f, contenu); ne lit que la première ligne du fichier pas la totalité

 
@+
Cirec

Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Statut
Membre
Dernière intervention
13 mars 2007

pour [auteurdetail.aspx?ID=3267 Delphiprog]
j'ai declarer ma variable en tant que 'textfile', et apprenant que mon erreur proviendrai du fait que mon fichier serai deja ouvert, j'ai tout de suite chercher où j'ai pus oublier de refermer le fichier, mais je n'ai pas trouvé d'endroit. Maintenant tu me dis que cela peut provenir d'un plantage precedent qui aurai pus laissé le fichier ouvert,  peut etre mais si oui  alors  lorsque  je  recompile il gardera le fait que le fichier est ouvert??
bizzare bizzare
mmmh du style des que je lance mon programme , je lui dis que faire un closefile(f) au cas ou, bof quoi.

sinon pour cirec, "readln(f, contenu); ne lit que la première ligne du fichier pas la totalité" , je sais bien , c'était un exemple pour resumer en gros que je recuperai le contenu

Effectivement Delphiprog   : mais quand on travaille sur les fichiers soit on utlise Try Except soit {$I-} {$I+} d'ou ma remarque.

http://fbeaulieu.developpez.com/guide/103-gestion-exceptions.html
http://bodman.developpez.com/ESdelphi/
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
@fiascoco : si tu oublies de refermer ton fichier dans le code, le fait de quitter l'application ne ferme pas le fichier pour autant. C'est le système d'exploitation qui le fermera quand :
1- on le lui demandera
2- il y aura fermeture de la session
3- à l'arrêt du système

Encore une hypothèse que j'ai oublié de te demander : les ouvertures et fermetures de fichier se font-elles uniquement dans le thread principal de l'application ?

@Francky : je suis d'accord avec toi. La désactivation du contrôle d'E/S doit être accompagnée de l'interprétation de la variable IOResult. C'était ce que je voulais dire.

May Delphi be with you !


<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Tout à fait.

J'ajouterai que, de toute manière, l'utilisation de try...except ou la
désactivation/activation de la gestion des erreurs, même avec
interprétation, n'est qu'un emplâtre sur une jambe de bois.

Quand un code plante systématiquement sur une suite d'instructions comprenant

la lecture/écriture dans un fichier, il y a intérêt à savoir pourquoi.

Sinon je ne vois pas trop à quoi, ou à qui il va pouvoir servir, ce code...

S'il est utile de protéger son code contre une erreur inattendue, il
n'est pas supportable d'écrire un code approximatif, en se croyant
quitte puisqu'il est "protégé" par un bloc de gestion des erreurs...

D'où l'intérêt de se pencher sur l'interprétation du message d'erreur retourné par Delphi, comme nous le rappelle Cirec.


Bonne prog'


japee
Messages postés
10
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
29 décembre 2010

ce topic date un peu mais si autres personnes recherche la solution au vu ce ce que tu as marqué, tu fait correctement ta lecture d'info, tu réécrit le fichier avec rewrite, mais tu as oublier avant toute écriture dans le nouveau fichier un append, important, car tu as refait le fichier mais pas ouvert, ton programme ne peut pas accéder au fichier, tu ne le lui a pas permis.

ex

assignfile(f, chemin_fichier);
rewrite (f);
APPEND(f);
writeln(f, tmp);
...
closefile(f);


Florent LEMAITRE
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
Salut,
[quote=ODLCITEINFO]mais tu as oublier avant toute écriture dans le nouveau fichier un append, important, car tu as refait le fichier mais pas ouvert, ton programme ne peut pas accéder au fichier, tu ne le lui a pas permis. /quote
c'est faux !!!
Append ne sert qu'à ajouter des données au fichier ... Lis tous les messages et tu verras que l'erreur venait d'un précédent plantage du programme qui du coup ne fermait pas le fichier ... Motif ?
Fiasco n'utilisait pas de bloc try/finnaly/end

Mais quoi qu'il en soit .. AssignFile/CloseFile sont obsolètes (cf. commentaire de F0xi)


[hr]@+Cirec
[hr]