Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Dubbele StreamWriters kunnen niet?

Pagina: 1
Acties:

  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 20-11 15:15

Kryziek

bb || !bb

Topicstarter
Hallo,

in mijn applicatie gebruik ik op verschillende plekken een StreamWriter om fout meldingen te loggen naar een text bestand. Maar op een gegeven moment komen er twee na elkaar en dat gaat dus fout. Voorbeeld:
C#:
1
2
using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(DateTime.Now + " test 1"); }
using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(DateTime.Now + " test 2"); }

De FileStream open ik zo:
C#:
1
fs = new FileStream("LocatieNaarLogBestand.txt", FileMode.Append, FileAccess.Write);

test 1 wordt wel opgeslagen in het bestand maar bij test 2 zegt hij dat de stroom niet schrijfbaar is.
Op google kon ik niet iets vergelijkbaars vinden en handmatig de eerste StreamWriter sluiten hielp ook niet.

Weet iemand waarom deze foutmelding komt en hoe het op te lossen is?

Mvg.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom gebruik je voor beide streamwriters dezelfde variabele :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 20-11 15:15

Kryziek

bb || !bb

Topicstarter
Kopieren en plakken. :D
Die wordt toch alleen gebruikt binnen de using, of zie ik dat verkeerd en is dat het probleem?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nee, ik zie 't nu; ik kon/kan de code niet goed zien op m'n foon :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • L-VIS
  • Registratie: April 2005
  • Laatst online: 21-11 22:49

  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 20-11 15:15

Kryziek

bb || !bb

Topicstarter
C#:
1
2
using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(DateTime.Now + " test 1"); sw.Close();}
using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(DateTime.Now + " test 2"); }


Zo heb ik het ook geprobeerd en dat werkt ook niet. Normaal gesproken zou de using de stream weer afsluiten.

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Wat is de foutmelding precies (exception)?

Volgens mij wordt op je FileStream ook Close() aangeroepen zodra aan het einde van de using StreamWriter.Dispose() wordt aangeroepen.

  • martennis
  • Registratie: Juli 2005
  • Laatst online: 06-11 21:06
@L-vis; met een using is dat niet nodig, aangezien de Dispose dat wel regelt.

  • L-VIS
  • Registratie: April 2005
  • Laatst online: 21-11 22:49
Oke misschien moet ik het duidelijker maken. Msdn zegt dat bij het afsluiten van een streamwriter ook de onderliggende stream wordt afgesloten. Maw je fs variabele is gesloten. Die zul je opnieuw moeten openen.

@martennis, nee klopt. Maar die using zorgt ervoor dat de streamwriter en de filestream worden afgesloten!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarschijnlijk is de file nog niet volledig afgesloten door het file-system. Werkt het wel goed als je er een korte pauze tussen zet?

Ik heb in ieder geval wel eerder gezien dat een file nog gelocked was als je hem snel achter elkaar probeert te openen.

edit: Wat L-VIS zegt is logischer inderdaad, je FileStream wordt ook gesloten, dus dan kan je inderdaad met een StreamWriter ook niet meer naar die stream schrijven.

[ Voor 24% gewijzigd door Woy op 07-01-2013 11:44 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • martennis
  • Registratie: Juli 2005
  • Laatst online: 06-11 21:06
Ochja, mi-scussi L-VIS!
Dat is waarschijnlijk het probleem idd.

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Zoals ik al zei dus :Y)

  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 20-11 15:15

Kryziek

bb || !bb

Topicstarter
Klopt helemaal! Bedankt! Als ik het zo doe werkt het wel:
C#:
1
2
3
using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(DateTime.Now + " test 1"); }
fs = new FileStream("LocatieLogFile.txt", FileMode.Append, FileAccess.Write);
using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine(DateTime.Now + " test 2"); }


Nu nog een manier vinden zodat ik niet elke keer die FileStream opnieuw hoef te openen.

  • L-VIS
  • Registratie: April 2005
  • Laatst online: 21-11 22:49
Dan kun je misschien het beste deze: MSDN: File.AppendAllText Method (String, String) (System.IO) gebruiken. Erg handig hiervoor ;)

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Of je gooit je FileStream in een wrapper die de Close en Dispose methodes overschreven heeft.

Zoiets dus: https://github.com/jolive...ion/IndisposableStream.cs

Je moet dan wel ergens een reference naar je FileStream houden zodat je hem zelf nog wel kan disposen als je hem niet meer nodig hebt.

Verwijderd

writer.Flush()

There is your anwer ;)

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Verwijderd schreef op maandag 07 januari 2013 @ 12:44:
writer.Flush()

There is your anwer ;)
Heb je de rest van de thread uberhaupt gelezen? 8)7

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Als je toch niks van de FileStream gebruikt, doe het gewoon zo:
C#:
1
2
using (TextWriter textWriter = new StreamWriter("C:\\a.cow", true))
    textWriter.WriteLine("MOO");

[ Voor 5% gewijzigd door Phyxion op 07-01-2013 12:54 ]

'You like a gay cowboy and you look like a gay terrorist.' - James May


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 23-11 16:52

Haan

dotnetter

Sowieso als het doel van die writers enkel is om te loggen, kan je wellicht beter naar een logging framework (NLog, Log4net) kijken.

Kater? Eerst water, de rest komt later


  • Kryziek
  • Registratie: Juni 2010
  • Laatst online: 20-11 15:15

Kryziek

bb || !bb

Topicstarter
Dat NLog ziet er wel goed uit. Ik gebruik hem nu ook. :D
Danku voor het aanraden. ;)

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 23-11 19:04

Sebazzz

3dp

HMS schreef op maandag 07 januari 2013 @ 11:58:
Of je gooit je FileStream in een wrapper die de Close en Dispose methodes overschreven heeft.

Zoiets dus: https://github.com/jolive...ion/IndisposableStream.cs

Je moet dan wel ergens een reference naar je FileStream houden zodat je hem zelf nog wel kan disposen als je hem niet meer nodig hebt.
Dat zou ik niet doen. Dat kan voor een vervelende maintenance issue zorgen en bovendien voor performanceproblemen of andere bugs in de handen van de verkeerde persoon. Dit komt omdat je 'natuurlijk' vanuit gaat dat een IDisposable zijn resources vrij laat: bij gebruik van zo'n class breek je het contract.

Dit soort oplossingen zou ik gebruiken voor als het niet anders kan bij een 3rd partylib maar in eigen code valt er veel betere oplossingen te bedenken dan een Stream wrappen.

[ Voor 7% gewijzigd door Sebazzz op 07-01-2013 23:26 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]

Pagina: 1