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

Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Dernière intervention
13 mars 2007
- - Dernière réponse : Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 17 nov. 2010 à 23:49
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);
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
3
Merci
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;

Merci f0xi 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de f0xi
Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Dernière intervention
13 mars 2007
0
Merci
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(...).
Commenter la réponse de fiascoco
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
0
Merci
oui oui c'est bien LoadFrom... et pas OpenFrom ... petit ripage memoriel.

Commenter la réponse de f0xi
Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Dernière intervention
13 mars 2007
0
Merci
Sinon, y a t'il moyen de savoir pourquoi il me faisait cette erreur ?
Commenter la réponse de fiascoco
0
Merci
On peut aussi utiliser {$I-} et {$I+} et ton erreur vient du fait que tu n'as pas utilisé ceci.
Commenter la réponse de Utilisateur anonyme
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
{$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/
Commenter la réponse de cs_Delphiprog
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
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" />
Commenter la réponse de Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
ps : readln(f, contenu); ne lit que la première ligne du fichier pas la totalité

 
@+
Cirec

Commenter la réponse de Cirec
Messages postés
7
Date d'inscription
mardi 9 janvier 2007
Dernière intervention
13 mars 2007
0
Merci
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
Commenter la réponse de fiascoco
0
Merci
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/
Commenter la réponse de Utilisateur anonyme
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
@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/
Commenter la réponse de cs_Delphiprog
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
0
Merci
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
Commenter la réponse de japee
Messages postés
10
Date d'inscription
samedi 28 janvier 2006
Dernière intervention
29 décembre 2010
0
Merci
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
Commenter la réponse de ODLCITEINFO
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
0
Merci
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]
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.