Entwickler-Ecke

Dateizugriff - Prüfen wer Datei geöffnet hat oder "Zwangsschliessen"


Metschu - Mo 13.09.10 20:18
Titel: Prüfen wer Datei geöffnet hat oder "Zwangsschliessen"
Nabends!

Folgendes Problem:
Prog liegt auf dem Server, mehrere User greifen darauf zu.
Die Daten werden in einem TRecord File auch auf dem Server gespeichert.
Damit es keine Zugiffskonflikte auf die Daten gibt, prüfe ich mit der Funktion "isFileInUse" (aus dem Forum), ob die Datei geöffnet ist.
Die Software öffnet die Datei, schreibt daten und Schliesst sie gleich wieder.

Jetzt ist es schon mehrfach vorgekommen, das die Funktion meldet, das Datei geöffnet ist und verweigert das Speichern.

In der Software habe ich schon mehrfach nachgeschaut, die Datei wird nach dem öffnen immer geschlossen (zumindest laut Quelltext...)

Gibt es eine Möglichkeit rauszufinden, welcher User im Netzwerk diesen "Fehler" verusacht?

Oder kann ich die Datei auch von Extern "Zwangsschliessen", um wieder drauf zugreifen zu können?

Das soll keine Entgültige Lösung sein, nur hilft es auch bei der Fehlersuche, wenn ich den User Fragen kann, was er gemacht hat um das nachzuvollziehen.

Danke schonmal.

Gruß

Torsten


Delete - Mo 13.09.10 20:47

Ich würde eine zweite Datei beim Öffnen anlegen und beim Schließen wieder löschen. Und wenn das zweite Programm die Datei öffnen will, prüft es vorher, ob die Datei existiert.


FinnO - Mo 13.09.10 21:28

Und wenn das Programm zwischendurch verreckt, Stromverbindung gekappt wird o.Ä.? Dann hat man den Salat und die Datei ist in Dauernutzung. Man müsste quasi mit Sessions arbeiten.

LG


Boldar - Mo 13.09.10 21:35

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Und wenn das Programm zwischendurch verreckt, Stromverbindung gekappt wird o.Ä.? Dann hat man den Salat und die Datei ist in Dauernutzung. Man müsste quasi mit Sessions arbeiten.

LG

Ich würde in die 2te Datei einfach eine Zeitangabe schreiben, und das Nutzungsrecht für T+x Sekunden vergeben. Wenn ein Programm länger braucht, muss es die Time-stamp datei refreshen.


FinnO - Mo 13.09.10 21:37

TRecord File schreit sowieso nach Datenbank ;)


Metschu - Mo 13.09.10 21:44

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
TRecord File schreit sowieso nach Datenbank ;)

... die man auf dem Server leider nicht installieren kann... :bawling:

Oder gibts ne Variante, bei der man nichts installieren brauch?

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde in die 2te Datei einfach eine Zeitangabe schreiben, und das Nutzungsrecht für T+x Sekunden vergeben. Wenn ein Programm länger braucht, muss es die Time-stamp datei refreshen.

Klingt Logisch und interessant. Wäre ein Work Arround.

Zusätzlich würde mich aber noch interessieren, wer die datei "offen" hält, um das Problem entgültig zu lösen.


FinnO - Mo 13.09.10 21:47

jo. Firebird Embedded


BenBE - Di 14.09.10 01:38

Man öffne beim Windows die Systemsteuerung, wähle Verwaltung, gehe dann auf Computer - Freigegebene Ordner - geöffnete Dateien ...


Tranx - Di 14.09.10 03:58

Manchmal geschieht das auch bei mir, dass in einem Programm solche Fehlermeldungen kommen. Oft ist der Datentransfer im Netz Schuld, der Server überlastet etc.
Es ist schon vorgekommen, dass man den Server neu starten musste, um eine solches hartnäckiges Problem zu lösen.

Für den Clientzugriff auf eine Datei empfehle ich ein Try .. finally .. end Konstrukt, dass selbst bei Programmfehlern immer der finally-Teil abgearbeitet wird.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
// Kein funktionierender Code, nur Codestruktur
try
  try
    Dateizugriffsroutine(n)
  except
    Fehlermeldung // vielleicht mit Schreiboperationen in eine lokale oder Userabhängige Fehlerdatei, um das zu dokumentieren)
  end
finally 
  try
    Datei Schließ-Routine
  except
    Fehlermeldung // vielleicht mit Schreiboperationen in eine lokale oder Userabhängige Fehlerdatei, um das zu dokumentieren)
  end
end


Dann sollte eigentlich das Ganze funktionieren, wenn Windows nicht dazwischenfunkt (s.o.).


jasocul - Di 14.09.10 07:54

Schreib doch zusätzlich eine Datei mit dem Benutzer-Namen. Dann siehst du, wer der Übeltäter ist.
Vielleicht passt die Info ja auch noch in den TRecord.