Datei exklusiv sperren

Alles rund um die Programmierung mit Qt
Antworten
Tikonteroga
Beiträge: 4
Registriert: 8. August 2008 21:24

Datei exklusiv sperren

Beitrag 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 ?
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Datei exklusiv sperren

Beitrag 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
ODT Informatik GmbH, Reto Tschofenig
Tikonteroga
Beiträge: 4
Registriert: 8. August 2008 21:24

Re: Datei exklusiv sperren

Beitrag 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?
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Datei exklusiv sperren

Beitrag 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.
ODT Informatik GmbH, Reto Tschofenig
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Re: Datei exklusiv sperren

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Re: Datei exklusiv sperren

Beitrag von upsala »

Bitte dabei aber beachten, daß das Programm abstürzen kann und eine lock-Datei hinterlassen kann.
Tikonteroga
Beiträge: 4
Registriert: 8. August 2008 21:24

Re: Datei exklusiv sperren

Beitrag 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.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Re: Datei exklusiv sperren

Beitrag 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...)
Tikonteroga
Beiträge: 4
Registriert: 8. August 2008 21:24

Re: Datei exklusiv sperren

Beitrag 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.
Antworten