Laden...

[gelöst] mehrere PC's schreiben Daten in eine Datei

Erstellt von mogli73 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.971 Views
M
mogli73 Themenstarter:in
92 Beiträge seit 2007
vor 15 Jahren
[gelöst] mehrere PC's schreiben Daten in eine Datei

ein Programm, welches von mehreren Usern gleichzeitig (auf versch. PC) genutzt wird schreibt zu einem Zeitpunkt x ca 40 Zeichen in eine TXT-Datei, welche auf einem Fileserver (oder auf einem freigegebenen Ordner) im Netzwerk gespeichert ist.

Mein Problem: Was passiert, wenn nun per Zufall 2 (oder noch mehr) PC's die Daten in die Datei speichern wollen?
Wie löse ich das?

FileStream fs = File.Open(@"C:\MyTestfile.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);

untersützt zwar fileShare - ich möchte aber den StreamWriter einsetzen.

F
240 Beiträge seit 2006
vor 15 Jahren

Für was benötigst du denn die Daten in der Datei? Wäre es nicht vieleicht auch möglich, unterschiedliche Dateien zu verwenden?

Denn wenn du einfach blind in eine Textdatei schreibst, auch wenn es nicht zu Kollisionen beim Zugriff kommt, wird es zu Datenverlust kommen.

Also entweder verschiedene Dateien verwenden, oder auf dem Server ein Service laufen lassen, der das schreiben übernimmt, nach dem Prinzip, dass das erste was reinkommt, auch als erstes geschrieben wird.

E
22 Beiträge seit 2008
vor 15 Jahren

untersützt zwar fileShare - ich möchte aber den StreamWriter einsetzen.

Der StreamWriter hat doch einen Konstruktor, dem man einen Stream übergeben kann..?

C
401 Beiträge seit 2007
vor 15 Jahren

Check einfach, ob die Datei momentan von einem der anderen Programme geöffnet ist und warte dann, bis du wieder Zugriff auf die Datei hast.

3.825 Beiträge seit 2006
vor 15 Jahren

Oder einfach sooft schreiben bis es geklappt hat.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
mogli73 Themenstarter:in
92 Beiträge seit 2007
vor 15 Jahren

oha vielen Dank für die vielen Antworten.

Oder einfach sooft schreiben bis es geklappt hat.
bzw.
Check einfach, ob die Datei momentan von einem der anderen Programme geöffnet ist und warte dann, bis du wieder Zugriff auf die Datei hast.

Finde ich eine gute Idee. Nur wie mach ich das? Ich öffne die Datei mit dem Streamwriter. Wie kann ich nun prüfen, ob die Datei schon offen ist?

Die Idee mit dem Dienst wird schwierig. Der "Fileserver" ist ein NAS (HD mit LAN). Da kann ich keine Dienste installieren.

Mehrere Dateien erstellen wäre auch möglich. Aber das realisiere ich erst dann, wenn alle anderen Lösungen nicht möglich sind

3.971 Beiträge seit 2006
vor 15 Jahren

Du versuchst die Datei normal zu öffnen, geht es schief, try... catch und in ein paar sekunden wieder probieren.

Als Hinweis, bitte verwende für das Warten nicht Thread.Sleep sondern einen der vielen Timer die das Framework anbieten.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

M
mogli73 Themenstarter:in
92 Beiträge seit 2007
vor 15 Jahren

so inzwischen ist das Problem gelöst. Danke an alle, die mitgeholfen haben.

Meine Lösung (gib sicherlich noch andere...)


FileStream fs = File.Open(Datei, FileMode.Append, FileAccess.Write, FileShare.None);
StreamWriter sw = new StreamWriter(fs);

entscheident ist FileShare.None.

danach mit try und catch => until true

3.971 Beiträge seit 2006
vor 15 Jahren

Eine Endlosschleife gehört da auch schonmal nicht rein. Dort ballerst du deine CPU mit unnützen Anweisungen zu. Nutze einen Timer und prüfe periodisch ob du die Datei öffnen kannst. Das ganze lässt kannst du zusammen in einer Klasse kapseln und anschließend gut und einfach benutzen und du sparst Ressourcen bei.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

M
mogli73 Themenstarter:in
92 Beiträge seit 2007
vor 15 Jahren

Ich habe auch nichts von einer Endlosschleife geschrieben.
Meine Lösung sieht vor, dass immer nach 0.1sec ein Versuch ausgeführt wird.
Nach max 300 Versuchen wird abgebrochen; natürlich mit einer entsprechenden Info an den User.
Ich will doch nicht dass das Prog. abstürtzt, nur weil der Fileserver gerade offline ist!!