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ü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.
untersützt zwar fileShare - ich möchte aber den StreamWriter einsetzen.
Der StreamWriter hat doch einen Konstruktor, dem man einen Stream übergeben kann..?
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.
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
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
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...
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
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...
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!!