écriture de fichiers textes

écriture de fichiers textes - C#/.NET managed - Programmation

Marsh Posté le 03-04-2004 à 21:28:31    

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)
Reply

Marsh Posté le 03-04-2004 à 21:28:31   

Reply

Marsh Posté le 03-04-2004 à 22:45:44    

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

Reply

Marsh Posté le 03-04-2004 à 22:51:47    

ç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)
Reply

Marsh Posté le 03-04-2004 à 22:56:45    

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 ?

Reply

Marsh Posté le 03-04-2004 à 23:04:44    

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)
Reply

Marsh Posté le 03-04-2004 à 23:05:30    

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 :/

Reply

Marsh Posté le 03-04-2004 à 23:24:28    

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

Reply

Marsh Posté le 03-04-2004 à 23:25:13    

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)
Reply

Marsh Posté le 03-04-2004 à 23:26:50    

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 :/

Reply

Marsh Posté le 03-04-2004 à 23:27:56    

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

Reply

Marsh Posté le 03-04-2004 à 23:27:56   

Reply

Marsh Posté le 03-04-2004 à 23:28:10    

[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)
Reply

Marsh Posté le 03-04-2004 à 23:34:35    

ben là je suis comme toi, je comprends pas

Reply

Marsh Posté le 03-04-2004 à 23:41:38    

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)
Reply

Marsh Posté le 03-04-2004 à 23:51:36    

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

Reply

Marsh Posté le 03-04-2004 à 23:57:57    

je demande a mes potes de #mono

Reply

Marsh Posté le 04-04-2004 à 00:04:47    

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)
Reply

Marsh Posté le 04-04-2004 à 00:16:34    

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)
Reply

Marsh Posté le 04-04-2004 à 00:24:55    

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

Reply

Marsh Posté le 04-04-2004 à 00:29:16    

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)
Reply

Marsh Posté le 04-04-2004 à 00:35:48    

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

Reply

Marsh Posté le 04-04-2004 à 00:44:26    

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)
Reply

Marsh Posté le 04-04-2004 à 00:55:26    

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 ?

Reply

Marsh Posté le 04-04-2004 à 09:17:03    

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)
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed