AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zugriff mehrerer User auf eine Datei
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff mehrerer User auf eine Datei

Ein Thema von Jean · begonnen am 6. Jul 2013 · letzter Beitrag vom 8. Jul 2013
Antwort Antwort
Seite 1 von 2  1 2      
Jean

Registriert seit: 15. Mär 2013
10 Beiträge
 
#1

Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 08:13
Hallo an alle Spezialisten,

vielleicht hat jemand eine gute Idee.

Ich möchte, dass ein Zugriff auf eine Datei im Netzwerk (Zugriff schreibend, lesend) von mehreren Usern gleichzeitig möglich ist.
Sicherlich könnten jetzt Vorschläge kommen, das ganze sicher über eine Datenbank zu realisieren. Diese Option sollte wirklich nur das allerletzte Hintertürchen sein, falls es wirklich nicht anders zu lösen ist.

In die Datei (ähnlich vielleicht wie bei einer *.ini) werden nur Benutzername und ein Wert geschrieben. Dieser Wert soll dann über die Anwendung gepollt und allen anderen Nutzern angezeigt werden (vergleichbar mit einer Highscore-Liste).

Bin über jeden geistigen Eisprung dankbar.

LG, Jean
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 08:24
Ich würde eine Datenbank mit embedded Zugriff verwenden, wie z.B. FireBird embedded, SQLite, MSSQL compact, ...
Du brauchst so kein DBMS installieren und brauchst dich trotzdem nicht um dir notwendige Synchronisierung des Dateizugriffs zu kümmern.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 09:00
Das ist eigentlich kein Problem; du muss nur angeben, dass die zentrale Datei von allen Prozessen zum Lesen und zum Schreiben geöffnet werden darf:
Delphi-Quellcode:
var
  fs : TFileStream;
begin
  fs := TFileStream.Create('N:\userlist.dat', fmOpenReadWrite or {alle dürfen lesen/schreiben}fmShareDenyNone);
  try
  finally
    fs.Free;
  end;
end;
Das Problem ist jetzt, dass mehrere Prozess gleichzeitig die Datei verändern können.
Du brauchst innerhalb der Datei eine Struktur, die verhindert das Prozess B das überschreibt was Prozess A gerade reingeschrieben hat.

Es gibt auch noch einen zweiten, sicheren Weg.
Hierbei darf immer nur ein Prozess auf die Datei zugreifen.
fs := TFileStream.Create('N:\userlist.dat', fmOpenReadWrite or fmShareExclusive);
Das Prinzip geht so:
ein Prozess öffnet die Datei exklusiv, liest den ganzen Inhalt und schreibt seinen Score und schliesst die Datei wieder.
Zwischen Öffnen und Schliesen sollte möglichst wenig Zeit vergehen.
Wenn eine Datei schon in Bearbeitung ist kann ein weiterer Prozess diese solange nicht öffnen.
Mit einem Timer versucht man es einfach mehrfach, bis man Erfolg hat.
Erfahrungswerte: das Prinip der exklusiv gesperrten Datei funktioniert gut auch bei 50 Rechner.
Bei voller Netzwerkauslastung kann ein Prozess aber auch schon mal 2 Sekunden blockiert sein, weil die Datei ständig von anderen Prozess geöffnet ist.
fork me on Github

Geändert von sx2008 ( 6. Jul 2013 um 09:16 Uhr)
  Mit Zitat antworten Zitat
Jean

Registriert seit: 15. Mär 2013
10 Beiträge
 
#4

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 09:05
Hallo,

vielen Dank für Eure Antworten.
Ich werde mich auf jeden Fall mit beiden Themen beschäftigen. Danke für die Tipps.

LG, Jean
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 09:07
Ich möchte, dass ein Zugriff auf eine Datei im Netzwerk (Zugriff schreibend, lesend) von mehreren Usern gleichzeitig möglich ist.
Sicherlich könnten jetzt Vorschläge kommen, das ganze sicher über eine Datenbank zu realisieren. Diese Option sollte wirklich nur das allerletzte Hintertürchen sein, falls es wirklich nicht anders zu lösen ist.
Das geht nicht, weil moderne Betriebssysteme verhindern, daß dieselbe Datei gleichzeitig von mehreren Usern offen gehalten werden kann. Eine scheinbare Lösung böte eine Stringlist, doch entsteht dabei ein anderes Problem: Stell dir vor, User1 liest die Datei in den Speicher ein (z.B. via Memo.Lines.LoadFromFile) und fügt der eingelesenen Liste einen neuen Wert hinzu. Währenddessen liest auch User2 diese Datei und addiert ebenfalls einen neuen Eintrag: User2 liest die Datei, bevor User1 sie zurückgeschrieben hat. Während User2 seinen Highscore einträgt, schreibt User1 die Stringliste zurück. Danach schreibt User2 seine Stringliste zurück und überschreibt somit die von User1 gemachten Änderungen, da er die ja beim Einlesen noch nicht kannte.

Fazit: Das ist keine brauchbare Lösung.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 09:09
Das ist eigentlich kein Problem; du muss nur angeben, dass die zentrale Datei von allen Prozessen zum Lesen und zum Schreiben geöffnet werden darf:

var
fs : TFileStream;
begin
fs := TFileStream.Create('N:\userlist.dat', fmOpenReadWrite or fmShareDenyNone);
try
finally
Und du meinst, dabei entstehen keine Probleme mit dem Überschreiben von Inhalten, wenn mehrere User gleichzeitig dieselbe Datei bearbeiten und verändern? Es geht ja nicht nur um's lesen, sondern auch um's zurückschreiben ...
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 09:14
Ich würde eine Datenbank mit embedded Zugriff verwenden, wie z.B. FireBird embedded, SQLite, MSSQL compact, ...
Du brauchst so kein DBMS installieren und brauchst dich trotzdem nicht um dir notwendige Synchronisierung des Dateizugriffs zu kümmern.
Äh - Firebird Embedded erlaubt nur einen Zugriff zur selben Zeit. Besteht bereits eine Connection, wird jeder Versuch, eine weitere Connection zu erstellen, abgewiesen. Außerdem müssen bei FB-embedded die DB-Dateien im selben Verzeichnis liegen wie die Anwendung. Wieso also embedded?

Besser wäre hier doch ein Server, der von allen erreichbar ist, oder eine Access-Datenbank, die kann man sogar auf einem Fileserver oder einer Netzwerkplatte betreiben kann. Ich hab das mal bei einem Verein realisiert, der keinen Netzwerkserver hatte, sondern nur eine Netzwerkplatte. Funzt bis heute einwandfrei, obwohl ich Timer einbauen mußte, um regelmäßig gewisse Tabellen abzufragen. Das macht aber bis heute so wenig Last, daß sich noch keiner beschwert hat.

Geändert von Perlsau ( 6. Jul 2013 um 09:17 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 10:11
Zitat:
Äh - Firebird Embedded erlaubt nur einen Zugriff zur selben Zeit. Besteht bereits eine Connection, wird jeder Versuch, eine weitere Connection zu erstellen, abgewiesen.
Ab 2.5 basiert die embedded nicht mehr auf der SuperServer, sondern der neuen SuperClassic Variante.
Zitat:
Außerdem müssen bei FB-embedded die DB-Dateien im selben Verzeichnis liegen wie die Anwendung. Wieso also embedded?
Nein die Datei muss nicht im selben Verzeichnis liegen.

Zitat:
Besser wäre hier doch ein Server, der von allen erreichbar ist,
Das wäre das Beste, ist aber nicht immer möglich und bedeutet Mehraufwand.
Zitat:
oder eine Access-Datenbank
Lieber nicht, da Access meiner Efahrung nach große Probleme bei Multiuserzugriff hat ( defekte Datenbanken usw.) zudem ist der Installationsaufwand bei den Client höher als bei anderen Lösungen.
Markus Kinzler
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Zugriff mehrerer User auf eine Datei

  Alt 6. Jul 2013, 10:26
Ab 2.5 basiert die embedded nicht mehr auf der SuperServer, sondern der neuen SuperClassic Variante.
Da bin ich offenbar nicht auf den Laufenden

Nein die Datei muss nicht im selben Verzeichnis liegen.
Auch dieses Feature seit 2.5? Muß ich heute abend mal testen ...

Lieber nicht, da Access meiner Efahrung nach große Probleme bei Multiuserzugriff hat ( defekte Datenbanken usw.)
Wie gesagt, ich hatte damit noch keine Probleme. Das ganze System (App und DB) ist so eingerichtet, daß jeder User lediglich seine eigenen Einträge bearbeiten kann. Es geht dabei in der Hauptsache um Terminvereinbarungen: jeder eingeloggte User kann natürlich für andere Mitarbeiter Termine vereinbaren, aber nur, wenn der betreffende User nicht eingeloggt ist, was bedeutet, er ist nicht im Haus und kann diesen Termin daher nicht selbst vereinbaren. Ändern kann dann wiederum nur der Mitarbeiter, der den Termin hat, diesen Eintrag. Es kommt zudem, wie mir berichtet wurde, nur äußerst selten vor, daß ein Mitarbeiter für einen anderen einen Termin vereinbart.

Wie gesagt, es funktioniert jetzt bereits seit über drei Jahren ohne Probleme.

zudem ist der Installationsaufwand bei den Client höher als bei anderen Lösungen.
Naja, das ist ein anderes Problem. In meinem Fall wurde das natürlich von mir persönlich eingerichtet und den Leuten erklärt. Und für mich war das kein nennenswerter Aufwand (das Entwickeln dagegen schon).
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Zugriff mehrerer User auf eine Datei

  Alt 7. Jul 2013, 04:18
Bei einer Highscore dürftest du das Problem mit dem "dirty writing" haben, sofern derjenige, der schreibt, auch die Logik ausführt (einsortieren in die Highscore Liste). Dafür muss es einen wechselseitigen Ausschluss geben.
Für soetwas dürfte das Fassade-Pattern angebracht sein - eine Schnittstelle, die das Eintragen übernimmt.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz