Seite 1 von 1

Datei exklusiv sperren

Verfasst: 18. Dezember 2012 08:36
von Tikonteroga
Hallo,

es gibt ein QtProgramm unter Windows, dass Dateien von einem bestimmten XML-Format bearbeitet. Es gibt dafür die klassischen Funktionen wie Öffnen, Speichern und Speichern unter..

Nun werden diese Dateien auf einem Netzlaufwerk abgelegt und es kann theoretisch von mehreren Benutzern von mehreren Rechnern aus auf diese Dateien zugegriffen werden.

Nun würde ich gerne erreichen, dass wenn ein Benutzer eine Datei geöffnet hat, ein anderer Benutzer die Datei nicht mehr mit diesem Programm öffnen kann. Es soll dann ein Meldung erscheinen, dass die Datei aktuell geöffnet oder zumindest gesperrt ist.

Unter Microsoft Excel ist dies z. B. möglich. Aber wie kann man dies mit Qt realisieren ?

Re: Datei exklusiv sperren

Verfasst: 18. Dezember 2012 11:09
von odt
Hallo Tikonteroga

In Qt Solutions gibt es ein Q(t)LockedFile, das QFile um "advisory locking functions" erweitert. Allerdings bin ich nicht sicher, ob es auf einem Netzwerk-FS funktioniert und ob es zukunftsträchtig (Qt5) ist.

Wir merken uns beim Laden das Datum der letzten Modifikation und prüfen vor dem Speichern, ob sich die Datei in der Zwischenzeit verändert hat (Pessimistisches Locking). Allenfalls könnte man das Datum periodisch überprüfen oder eine zusätzliche Locking-Datei einführen.

Wenn das Programm nur unter Win laufen muss, könnte es evt. reichen, die Datei im Schreibmodus offen zu lassen. Ich glaube (bin aber nicht sicher), dass dann die Datei zumindest lokal gesperrt ist.

Viele Grüsse
Reto

Re: Datei exklusiv sperren

Verfasst: 18. Dezember 2012 13:52
von Tikonteroga
odt hat geschrieben: In Qt Solutions gibt es ein Q(t)LockedFile, das QFile um "advisory locking functions" erweitert. Allerdings bin ich nicht sicher, ob es auf einem Netzwerk-FS funktioniert und ob es zukunftsträchtig (Qt5) ist.
Hallo, also laut der Dokumentation funktioniert es nur mit Prozessen auf der gleichen Maschine. Es wird wohl nicht über das FileSystem gesperrt.

Mit der Funktion CreateFile() aus der Windows.h konnte ich bereits das von mir gewünschte Verhalten erreichen. Soweit ich weiss, ist Qt für Windows zu Teil mit der Windows.h implementiert (z. B. QThread). Jetzt stellt sich die Frage, ob die Funktion CreateFile() auch von Qt verwendet wird?
odt hat geschrieben: Wenn das Programm nur unter Win laufen muss, könnte es evt. reichen, die Datei im Schreibmodus offen zu lassen. Ich glaube (bin aber nicht sicher), dass dann die Datei zumindest lokal gesperrt ist.
Welche Klassen bzw. Methoden muss ich denn hierfür verwenden?

Re: Datei exklusiv sperren

Verfasst: 18. Dezember 2012 14:02
von odt
ich dachte auch an das CreateFile aus der WinAPI. Ob QFile dieses einsetzt, weiss ich nicht. Darum auch das evt. Dies wäre zu evaluieren, ob ein QFile.open mit QIODevice::ReadWrite "lockt", solange kein close/destructor aufgerufen wird.

Re: Datei exklusiv sperren

Verfasst: 18. Dezember 2012 22:54
von -=Freaky=-
hallo,

ich wuerde auch einfach mal probieren, es mit QFile les- und schreibbar zu oeffnen. Ich denke im die Win-Api gibt es keinen (sinnvollen) Umweg unter Windows, d.h. die wird wohl irgendwo verwendet werden?
Ansonsten koenntest du etwas tun, was andere Programme auch schon tun (z.B. Libre Office glaube ich), und eine temporaere lock-Datei erstellen. Willst du zum Beispiel "Text.txt" editieren, erstell dein Programm beim Oeffnen "Text.txt.locked" oder aehnlich. Die naechste Programminstanz sieht, dass diese Datei existiert (ohne sie geoffnet zu haben), und weiss damit, dass "Text.txt" blockiert ist. Falls das fuer Dich ein denkbarer Ansatz waere.

Re: Datei exklusiv sperren

Verfasst: 18. Dezember 2012 23:00
von upsala
Bitte dabei aber beachten, daß das Programm abstürzen kann und eine lock-Datei hinterlassen kann.

Re: Datei exklusiv sperren

Verfasst: 19. Dezember 2012 13:41
von Tikonteroga
-=Freaky=- hat geschrieben:hallo,

ich wuerde auch einfach mal probieren, es mit QFile les- und schreibbar zu oeffnen. Ich denke im die Win-Api gibt es keinen (sinnvollen) Umweg unter Windows, d.h. die wird wohl irgendwo verwendet werden?
Ansonsten koenntest du etwas tun, was andere Programme auch schon tun (z.B. Libre Office glaube ich), und eine temporaere lock-Datei erstellen. Willst du zum Beispiel "Text.txt" editieren, erstell dein Programm beim Oeffnen "Text.txt.locked" oder aehnlich. Die naechste Programminstanz sieht, dass diese Datei existiert (ohne sie geoffnet zu haben), und weiss damit, dass "Text.txt" blockiert ist. Falls das fuer Dich ein denkbarer Ansatz waere.
Hallo,

also den Ansatz mit der lock-Datei wurde mir auch schon vorgeschlagen.

Mit diesem Ansatz habe ich jedoch schlechte Erfahrungen gemacht. Mein Vorredner hat das ja schon angemerkt. Wenn die Anwendung abstürzt, wird die Datei im lock-File nicht mehr freigegeben bzw. das lock-File wird nicht gelöscht. Der Benutzer muss dann diesen Mechanismus kennen und die Datei manuel löschen.

Bei dem Ansatz mit CreateFile() besteht die Möglichkeit, dass das Betriebssystem den HANDLE automatisch freigibt, wenn es merkt, dass der Prozess beendet wurde.

Re: Datei exklusiv sperren

Verfasst: 19. Dezember 2012 18:51
von -=Freaky=-
Tikonteroga hat geschrieben:
-=Freaky=- hat geschrieben:hallo,

ich wuerde auch einfach mal probieren, es mit QFile les- und schreibbar zu oeffnen. Ich denke im die Win-Api gibt es keinen (sinnvollen) Umweg unter Windows, d.h. die wird wohl irgendwo verwendet werden?
Ansonsten koenntest du etwas tun, was andere Programme auch schon tun (z.B. Libre Office glaube ich), und eine temporaere lock-Datei erstellen. Willst du zum Beispiel "Text.txt" editieren, erstell dein Programm beim Oeffnen "Text.txt.locked" oder aehnlich. Die naechste Programminstanz sieht, dass diese Datei existiert (ohne sie geoffnet zu haben), und weiss damit, dass "Text.txt" blockiert ist. Falls das fuer Dich ein denkbarer Ansatz waere.
Hallo,

also den Ansatz mit der lock-Datei wurde mir auch schon vorgeschlagen.

Mit diesem Ansatz habe ich jedoch schlechte Erfahrungen gemacht. Mein Vorredner hat das ja schon angemerkt. Wenn die Anwendung abstürzt, wird die Datei im lock-File nicht mehr freigegeben bzw. das lock-File wird nicht gelöscht. Der Benutzer muss dann diesen Mechanismus kennen und die Datei manuel löschen.

Bei dem Ansatz mit CreateFile() besteht die Möglichkeit, dass das Betriebssystem den HANDLE automatisch freigibt, wenn es merkt, dass der Prozess beendet wurde.
Ich stimme voll und ganz zu, solange es mit Mitteln des Betriebssystems (Dateisystems) funktioniert, wird das wahrscheinlich der schmerzloseste Weg mit den wenigstens Nebenwirkungen sein.
Der Vorschlag war gedacht fuer den Fall, dass du diese Mittel nicht benutzen kannst/willst (z.B. zwecks Portierbarkeit auf andere OS oder weil es Qt nicht in der Form unterstuetzt oder was auch immer).
Mal weitergedacht: Wenn die Programme sowieso aufs Netzwerk zugreifen koennen, koennten sie sich nicht auch unterhalten und den anderen direkt mitteilen, welche Datei sie gerade offen haben? (Und wieder habe ich keine Ahnung ob das fuer Dich ueberhaupt Sinn macht. Ich werf gerne einfach Dinge in den Raum...)

Re: Datei exklusiv sperren

Verfasst: 19. Dezember 2012 22:26
von Tikonteroga
Hallo,

also ich habe mal mit dem Gedanken gespielt einen Subversion-Server zu verwenden und die Anwendung bindet einen SVN Client als EXE ein und macht bei bestimmten Ereignissen einen Checkin bzw. Checkout.

Somit könnte man auch sämtliche Änderungen mitverfolgen sowie auch wer welche Änderungen gemacht. Auch ein gemeinsamer Zugriff auf eine Datei würde verhindert werden, da jeder eine eigene Working Copy verwenden würde. Dies wäre aber technisch aufwändiger umzusetzen. Auch weil hier der Geschäftsprozess sowie die Infrastruktur angepasst werden müssten. Das wird wohl ziemlich teuer ...

Dieser Mechanismus mit dem Lock über das Dateisystem ist vorerst die bessere Lösung. Auch weil Zeit und Ressourcen leider begrenzt sind.