Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2028 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  écriture de fichiers textes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

écriture de fichiers textes

n°691892
drasche
Posté le 03-04-2004 à 21:28:31  profilanswer
 

Code :
  1. using System;
  2. using System.IO;
  3. namespace DaFloodMachine {
  4. public class Elements {
  5.  private FileStream fsSect;
  6.  private StreamWriter swSect;
  7.  private string strSql;
  8.  ...
  9.  public Elements() {
  10.   ...
  11.   fsSect = new FileStream("fill-tblsect.sql", FileMode.Create, FileAccess.Write, FileShare.Read);
  12.   ...
  13.   swSect = new StreamWriter(fsSect);
  14.   ...
  15.  }
  16.  ~Elements() {
  17.   ...
  18.   swSect.Flush();
  19.   fsSect.Flush();
  20.   swSect.Close();
  21.   fsSect.Close();
  22.   swSect = null;
  23.   fsSect = null;
  24.   ...
  25.  }
  26.  public uint AddSection() {
  27.   ...
  28.   swSect.WriteLine(strSql);
  29.   return iCntSect;
  30.  }
  31.  ...
  32. }
  33. }


 
En résumé, j'ai une classe qui me génère des ordres SQL et les balance dans des fichiers. Mais j'ai ceci:
 

Citation :

An unhandled exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll
 
Additional information: Cannot access a closed file.


 
dès que j'essaie un flush :??:
 
En fait, j'ai essayé plein de combinaisons, d'autres techniques pour écrire du texte dans un fichier (style File.CreateText qui renvoie directement un pointeur sur un StreamWriter, mais ça fait de l'UTF-8), etc etc... Et là j'en ai ma claque, marre, je pige rien, j'ai parcouru l'aide de long en large, toujours cette erreur qui survient!
 
Ah j'ai aussi à un moment donné viré les expressions avec le null parce que ça plantait aussi (selon l'aide, le Close() appelle le Dispose(true)).
 
Est-ce que quelqu'un peut m'éclairer sur la question? :??:
 
(oui, dans mon code, strSql contient bien quelque chose, donc j'ai l'assurance que mon fichier doit contenir quelque chose).
 
A la fin, j'ai été bourrin en mettant du try-catch partout, ou alors faire juste Close sur chaque objet, mais il n'y a pas de Flush implicite puisque mes fichiers ne sont pas complets.
 
Help :cry:


Message édité par drasche le 03-04-2004 à 21:29:28

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
mood
Publicité
Posté le 03-04-2004 à 21:28:31  profilanswer
 

n°691983
verdoux
And I'm still waiting
Posté le 03-04-2004 à 22:45:44  profilanswer
 

Virer le destructeur ? (bah oui c'est du c#)

n°691985
drasche
Posté le 03-04-2004 à 22:51:47  profilanswer
 

ça plante plus mais les fichiers restent incomplets :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°691989
Taz
bisounours-codeur
Posté le 03-04-2004 à 22:56:45  profilanswer
 

verdoux a écrit :

Virer le destructeur ? (bah oui c'est du c#)

rien à voir.
 
tu l'utilise comment ton fichier ? parce que c'est chelou que ça Dispose() tout seul ?

n°691993
drasche
Posté le 03-04-2004 à 23:04:44  profilanswer
 

bin j'ai montré tout le code lié au fichier: je le crée/ouvre (sachant qu'il n'existe pas sinon exception), j'écris dedans à coups de WriteLine sur le StreamWriter, puis je veux le fermer et ça coince :/
 
les exemples fournis dans MSDN sont encore plus dépouillés que ça mais impossible d'avoir mon fichier complètement enregistré dans mon cas :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°691994
Taz
bisounours-codeur
Posté le 03-04-2004 à 23:05:30  profilanswer
 

Code :
  1. using System;
  2. using System.IO;
  3.  
  4. namespace DaFloodMachine
  5. {
  6.     public class Elements
  7.     {
  8.         private FileStream fsSect;
  9.         private StreamWriter swSect;
  10.         private string strSql;
  11.      
  12.         public Elements(string s)
  13. {
  14.     fsSect = new FileStream("fill-tblsect.sql", FileMode.Create, FileAccess.Write, FileShare.Read);
  15.     swSect = new StreamWriter(fsSect);
  16.     strSql = s;
  17. }
  18.      
  19.         public uint AddSection()
  20. {
  21.     swSect.WriteLine(strSql);
  22.     Console.WriteLine(strSql);
  23.     return 0;
  24.         }
  25. public static void Main(string[] args)
  26. {
  27.     Elements e = new Elements("aahaa ahahah" );
  28.     e.AddSection();
  29. }
  30.        
  31.     }
  32. }

ça me crée le fichier mais il est vide :/

n°691997
Taz
bisounours-codeur
Posté le 03-04-2004 à 23:24:28  profilanswer
 

je viens de comprendre, c'est leur bordel IDisposable que je trouve très mauvais ... faut absolument mettre un Close() / using ça marche dans le main, mais là j'y arrive pas du tout avec une classe

n°691998
drasche
Posté le 03-04-2004 à 23:25:13  profilanswer
 

je sais pas si ça change grand chose, mais j'ai en fait 7 fichiers à ouvrir dans cette classe, sur lesquels je travaille de façon identique. Je suis évidemment en mode de compilation Debug.
 
J'ai cherché à faire un

Code :
  1. ? fsSect.Length


pour avoir la longueur du stream, et il m'a remballé une System.ObjectDisposedException, donc c'est bien une ressource détruite avant la fin alors qu'il n'y a pas de raison :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°692000
verdoux
And I'm still waiting
Posté le 03-04-2004 à 23:26:50  profilanswer
 

Oui le flush ne flush pas vraiment. Le dispose ne close pas (par contre le close dispose). Et le destructeur (ou finalizer) c'est aléatoire.
Les void* c'était mieux :/

n°692001
Taz
bisounours-codeur
Posté le 03-04-2004 à 23:27:56  profilanswer
 

moi j'ai pas d'exception, mais j'ai beau fluser/Closer/Disposer rien, alors que
 

Code :
  1. public class Elements
  2. {
  3.     public static void Main(string[] args)
  4.     {
  5. FileStream   fs = new FileStream("fill-tblsect.sql", FileMode.Create, FileAccess.Write);
  6. StreamWriter sw = new StreamWriter(fs);
  7. //  using(sw)
  8. //      {
  9.  foreach(string s in args)
  10.      {
  11.   sw.WriteLine(s);
  12.      }   
  13. //      }
  14.  sw.Close();
  15.     }     
  16. }

using ou Close ça marche parfaitement

mood
Publicité
Posté le 03-04-2004 à 23:27:56  profilanswer
 

n°692002
drasche
Posté le 03-04-2004 à 23:28:10  profilanswer
 

[censuré langage de |@#%* tout ça :fou: ]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°692010
Taz
bisounours-codeur
Posté le 03-04-2004 à 23:34:35  profilanswer
 

ben là je suis comme toi, je comprends pas

n°692018
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-04-2004 à 23:41:38  profilanswer
 

essaie de poster sur microsoft.public.fr.dotnet.csharp ou sur microsoft.public.dotnet.languages.csharp, peut être qu'ils sauront d'ou ça vient :/


---------------
J'ai un string dans l'array (Paris Hilton)
n°692023
Taz
bisounours-codeur
Posté le 03-04-2004 à 23:51:36  profilanswer
 

ça doit être un truc tout con ... parce que là ...

n°692025
Taz
bisounours-codeur
Posté le 03-04-2004 à 23:57:57  profilanswer
 

je demande a mes potes de #mono

n°692026
drasche
Posté le 04-04-2004 à 00:04:47  profilanswer
 

merci :jap:
 
je continue à chercher sur google pour le moment :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°692028
drasche
Posté le 04-04-2004 à 00:16:34  profilanswer
 

chuis tombé là-dessus: http://www.williamcaputo.com/archives/2003_11.html (recherchez ObjectDisposedException dans la page)
 
le mec fait carrément un System.GC.SuppressFinalize sur son StreamWriter. Et ça marche :pfff:
 
par contre le GC parvient quand même à perdre le FileStream.
 
'fin ça confirme que le IDisposable n'a pas un comportement très bien défini :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°692031
Taz
bisounours-codeur
Posté le 04-04-2004 à 00:24:55  profilanswer
 

ben je comprends pas, avec un main, ça marche bien ... ce que tu dis, c'est ce qu'il faut faire quand toi tu implémentes IDisposable ... s'eu été trop facile si le destructeur d'un strema le fermé :o

n°692032
drasche
Posté le 04-04-2004 à 00:29:16  profilanswer
 

bin c'est bordélique, obligé de dire au GC de pas toucher aux streams, c'est lamentable :/


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°692035
kaa
Posté le 04-04-2004 à 00:35:48  profilanswer
 

tu pourrais essaye stp en enlevant juste ces 2 lignes :
 
           swSect = null;  
           fsSect = null;  
           
pour voir.
 

n°692036
drasche
Posté le 04-04-2004 à 00:44:26  profilanswer
 

ah mais non ça plantait déjà sur le flush du FileStream :/
 
ceci dit, il semble que si le StreamWriter a rempli son job et est correctement détruit, les fichiers sont complets et je ne mange aucune erreur (ce que j'attendais au départ évidemment [:joce])
 
mais le coup du GC.... les GC SAPUDESPIEDS :fou:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°692037
Taz
bisounours-codeur
Posté le 04-04-2004 à 00:55:26  profilanswer
 

je comprends rien ..; les destructeurs sont disant appelés mais non... tout le monde me dit de que non alors que la documentation dit le contraire. j'ai déjà constaté que ça marché mais là
 
using System;  
class A  
{  
   ~A() {  
      Console.WriteLine("A's destructor" );  
   }  
}  
class B: A  
{  
   ~B() {  
      Console.WriteLine("B's destructor" );  
   }  
}  
class Test  
{  
   static void Main() {  
      B b = new B();  
      b = null;  
      GC.Collect();  
      GC.WaitForPendingFinalizers();  
   }  
}  
 
ne marche meme plus ... tout le monde me dit d'appeler explicitement Flsuh() && Close() ...
 
peut etre que le mieux, c'est de faire IDisposable ta classe ?

n°692059
drasche
Posté le 04-04-2004 à 09:17:03  profilanswer
 

j'avais essayé sur le conseil d'Harko hier mais sans obtenir le résultat voulu. Je réesaierai aujourd'hui :jap:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  écriture de fichiers textes

 

Sujets relatifs
Modification textes en fonction d'un choix de menu déroulantUploader plusieurs fichiers par un même formulaire ?
Lire les fichiers de logGestion d'image sans passer par des fichiers.
ouvrir des fichiers[C++] Exercice basique sur les fichiers
méthode optimisée d'écriture dans un fichier loghebergeur avec re-ecriture d'url !
Bases de données et fichiers Excel[résolu]lancement de requetes contenu dans des fichiers texte (vb6)
Plus de sujets relatifs à : écriture de fichiers textes


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)