[C#]Datei auslesen Fortschirtt

06/25/2013 22:22 GodHacker#1
Hallo,
ich brauche eure Hilfe, da ich nicht weiß, wie ich z.B. eine *.txt-Datei auslesen kann und dabei eine Progressbar dazu laufen lassen kann.
Ich würde es gerne so machen, dass die Progressbar anzeigt, wie viel von der ganzen Datei bereits gelesen wurde.

Ich hoffe, dass mir jemand dabei helfen kann.
06/25/2013 23:26 Requi#2
Was genau ist das Problem?
06/26/2013 00:12 GodHacker#3
Ich habe ersteinmal versucht zeichenweise eine txt-Datei zu lesen (nicht die zeichen zu speichern) und dabei das ganze mit einer Progressbar sichtbar zu machen. Hier kommt aber schon das erste problem, dass es zwar die Datei durch geht, aber die Form hängt (also weder eine Textbox, noch die Progressbar "Aktuallisiert" (bzw. ändert).
Ich weiß außerdem nicht, wie ich dies dann mit Zeilen mache. Es soll also die Anzahl der Zeilen bestimmt werden und anschließend Zeile für Zeile eingelesen werden und der Fortschritt dabei mit der Progressbar angezeigt werden. (sollte es nicht Zeile für Zeile gehen, bin ich auch offen für alternativen).
Im ganzen geht es mir nur darum, dass ich eine Datei lesen will, und den Fortschritt an einer Progressbar sichtbar machen kann (es müssen also genaue x von max. angaben sein).
06/26/2013 00:20 Requi#4
Wenn das auslesen klappt, würde ich einfach, mit einem neuen Thread die Aufgabe ausführen lassen. Denn dann hängt die Form nicht und sieht auch "schöner" aus.

Gibt auch die unsaubere Möglichkeit eines Backgroundworkers. Macht genau das selbe.
06/26/2013 08:41 SwarN#5
1. Zaehlervariable deklarieren
2. Datei einlesen (Streamreader)
3. Zahlervariable hochzählen lassen (Readline)
4. Progressbar den Zähler mitteilen
5. Datei erneut lesen (Readline von vorne)

Das ganze kannst du jetzt natürlich in einem extra Thread (wie Requi schon gesagt hat) machen oder wenn es wirklich nur simpl gemacht werden soll machst du nachdem du der ProgressBar ein neues Value zugewiesen hast ein "Application.DoEvents()" damit aktualisiert sich deine Form, bzw es werden alle Event's was anfallen erledigt und dann geht es nach dem DoEvents wieder weiter. Das ist natürlich unter umständen nicht zu empfehlen, jedoch meist ausreichend.
06/26/2013 09:53 Cholik#6
Sauber wäre es aber definitiv in einem eigenen Thread aufgehoben. Via FileInfo kann man sich dann bequem die Länge holen und anhand von CurrentPosition die ProgressBar updaten lassen.

Oder man setzt da einfach auf den Buffer, setzt dem ein Limit wie man lustig ist und updated bei dessen Refresh einfach immer die ProgressBar.
06/26/2013 13:07 dready#7
Application.DoEvents() ist ein relativ zielstrebiger Weg zu ner Menge Kopfweh :P
Wollt ich nur mal kurz anmerken, ansonsten hat Walter es ja schon praktisch perfekt zusammengefasst.

@Requi was genau findest an nem Backroundworker unsauber ? Wenn ich es nicht falsch im Kopf hab ist es doch einfach nur ein Wrapper um die Threadingklasse ?
06/26/2013 13:46 MoepMeep#8
Mal so ganz nebenbei, wie groß ist bitte diese Textdatei das du eine Progressbar anzeigen willst?
Ich hab letztens einen Parser für ca 5GB an Textdateien geschrieben, lief keine 5 Minuten und war nicht auf Geschwindigkeit optimiert, eher im gegenteil.
06/26/2013 13:57 qkuh#9
Bei 5 Minuten ist doch eine Progressbar gar nicht so schlecht.
06/26/2013 14:16 MoepMeep#10
Quote:
Originally Posted by qkuh View Post
Bei 5 Minuten ist doch eine Progressbar gar nicht so schlecht.
Bei 5 Minuten wäre es eine Option, ich glaube aber kaum das es bei ihm 5GB sein werden. Ein paar MB große Dateien sind fertig bevor der Nutzer die Progressbar überhaupt sieht.
06/26/2013 17:11 Else#11
Wie wäre es damit die Datei in Bytes zu lesen und den Progressbar dem entsprechend zu aktualisieren?! Das ist wesentlich einfacher, als das Auslesen der Zeilen, usw. usw.
06/26/2013 17:36 GodHacker#12
Hm...
Sind ja schon einige Ideen, die gut klingen. Ich werde es mir mal alles ansehen und testen.

PS: Die Dateien sind unterschiedlich groß. Ob ich irgendwann mal eine Datei mit 1-2GB (höher bestimmt nicht) habe, kann ich noch nicht sagen.

Ich bedanke mich für eure bisherige Hilfe.
Sollte ich noch Probleme haben, dann frage ich einfach nach.
06/26/2013 18:54 AT0MiX#13
Quote:
Originally Posted by Else View Post
Wie wäre es damit die Datei in Bytes zu lesen und den Progressbar dem entsprechend zu aktualisieren?! Das ist wesentlich einfacher, als das Auslesen der Zeilen, usw. usw.
eigentlich nicht.

Was spricht gegen Zeilen!?
Und wie auch schon an den oberen Posts entnommen werden kann, ist eine ProgressBar bei einer Datei die kleiner als 100 MB (und ich glaube kaum, dass du eine 100 MB Datei auslesen willst) unnötig.
06/26/2013 18:54 Requi#14
Quote:
Originally Posted by dready View Post
@Requi was genau findest an nem Backroundworker unsauber ? Wenn ich es nicht falsch im Kopf hab ist es doch einfach nur ein Wrapper um die Threadingklasse ?
Ich bevorzuge lieber "With New Thread", da ein Backgroundworker immer so hingeklatscht aussieht.
06/26/2013 19:31 Cholik#15
Quote:
Originally Posted by Requι View Post
Ich bevorzuge lieber "With New Thread", da ein Backgroundworker immer so hingeklatscht aussieht.
Hingeklatscht wäre aber eher die Variante über System.Threading.Thread zu gehen. Ein Backgroundworker hat idR den Scope bzw Kontext zur UI somit spart man sich die lästigen Invokes. Die direkte Thread-Klasse sollte man dann eher in Konsolenapplikationen nutzen oder alternativ, wenn man einfach nur Berechnungen durchführt, die mit der UI des Programms nichts zu tun haben.

Ggf auch hier mal schauen [Only registered and activated users can see links. Click Here To Register...]