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

fiascoco 7 Messages postés mardi 9 janvier 2007Date d'inscription 13 mars 2007 Dernière intervention - 12 janv. 2007 à 18:26 - Dernière réponse : Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention
- 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
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 13 janv. 2007 à 04:44
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

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

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

Commenter la réponse de f0xi
fiascoco 7 Messages postés mardi 9 janvier 2007Date d'inscription 13 mars 2007 Dernière intervention - 13 janv. 2007 à 14:57
0
Merci
Sinon, y a t'il moyen de savoir pourquoi il me faisait cette erreur ?
Commenter la réponse de fiascoco
Utilisateur anonyme - 13 janv. 2007 à 20:31
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
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 13 janv. 2007 à 23:44
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 14 janv. 2007 à 12:42
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 14 janv. 2007 à 13:58
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
fiascoco 7 Messages postés mardi 9 janvier 2007Date d'inscription 13 mars 2007 Dernière intervention - 14 janv. 2007 à 16:26
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
Utilisateur anonyme - 14 janv. 2007 à 16:56
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
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 14 janv. 2007 à 19:16
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
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 14 janv. 2007 à 20:54
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
ODLCITEINFO 10 Messages postés samedi 28 janvier 2006Date d'inscription 29 décembre 2010 Dernière intervention - 17 nov. 2010 à 22:46
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 17 nov. 2010 à 23:49
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.