écriture de fichiers textes - C#/.NET managed - Programmation
Marsh Posté le 03-04-2004 à 22:51:47
ça plante plus mais les fichiers restent incomplets
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 ?
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
Marsh Posté le 03-04-2004 à 23:05:30
Code :
|
ça me crée le fichier mais il est vide
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
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 :
|
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
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
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 :
|
using ou Close ça marche parfaitement
Marsh Posté le 03-04-2004 à 23:28:10
[censuré langage de |@#%* tout ça ]
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
Marsh Posté le 04-04-2004 à 00:04:47
merci
je continue à chercher sur google pour le moment
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
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
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é
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
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.
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 )
mais le coup du GC.... les GC SAPUDESPIEDS
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 ?
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
Marsh Posté le 03-04-2004 à 21:28:31
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:
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
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)