Datei exklusiv sperren
-
- Beiträge: 4
- Registriert: 8. August 2008 21:24
Datei exklusiv sperren
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 ?
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
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
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
-
- Beiträge: 4
- Registriert: 8. August 2008 21:24
Re: Datei exklusiv sperren
Hallo, also laut der Dokumentation funktioniert es nur mit Prozessen auf der gleichen Maschine. Es wird wohl nicht über das FileSystem gesperrt.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.
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?
Welche Klassen bzw. Methoden muss ich denn hierfür verwenden?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.
Re: Datei exklusiv sperren
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
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
Re: Datei exklusiv sperren
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.
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
Bitte dabei aber beachten, daß das Programm abstürzen kann und eine lock-Datei hinterlassen kann.
-
- Beiträge: 4
- Registriert: 8. August 2008 21:24
Re: Datei exklusiv sperren
Hallo,-=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.
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.
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
Re: Datei exklusiv sperren
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.Tikonteroga hat geschrieben:Hallo,-=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.
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.
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...)
-
- Beiträge: 4
- Registriert: 8. August 2008 21:24
Re: Datei exklusiv sperren
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.
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.