Feststellen, ob eine Datei (evtl. auf anderem Rechner) geöffnet ist



  • Hallo,

    ich habe ein Problem, zu dem ich trotz intensiver Suche noch keine Lösung gefunden habe. Ich weiß auch nicht, ob ich hier richtig bin, da es sich vielleicht auch mit einer MFC-Funktion lösen ließe??

    Zu meiner Frage:

    Ich habe eine Dokumentenverwaltung geschrieben, bei der es nötig ist, dass Dateien im schreibgeschützten sowie auch im Write-Modus von der jeweils zuständigen Applikation geöffnet werden können.
    Ich verfahre bisher folgendermaßen:
    Datei wird mit ShellExecute(...) geöffnet, nachdem der Schreibschutz gesetzt bzw. entfernt wurde.
    Das funktioniert wunderbar, wenn nur ein Rechner diese Dokumentenverwaltung nutzt. Sobald jedoch mehrere Rechner darauf zugreifen, kann es natürlich passieren, dass Rechner A das Dokument zum editieren geöffnet hat und Rechner B das gleiche Dokument nur zur Ansicht öffnen will. In diesem Fall hat A Pech gehabt, wenn er später seine Änderungen speichern will, da durch das schreibgeschützte Öffnen von B der Schreibschutz der Datei gesetzt wurde.
    Nun müsste ich herausfinden, ob die Datei evtl. von einem anderen User momentan geöffnet ist, um in diesem Fall den Schreibschutz nicht zu setzen. Nur... wie?
    Ich habe schon versucht, das über den Rückgabewert von LockFile(...) herauszubekommen; diese Funktion gibt allerdings auch TRUE zurück, wenn das Dokument (getestet mit .doc- und AutoCAD-.dwg-Dateien) bereits an anderer Stelle geöffnet ist.
    Oder bin ich mit meiner Vorgehensweise total auf dem falschen Dampfer?🙄
    Für Tipps wäre ich sehr dankbar.

    Vielen Dank und viele Grüße
    Peter



  • ich finde dein ansatz etwas verwirrend 😃
    setzt du den schreibschutz ?

    lies dir doch mal folgende links durch, damit kannst du dateien öffnen im entsprechenden modus, testen ob sie schon geöffnet sind (rückgabewert und getlasterror) und hast jede menge flags mit denen du spielen kannst.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/creating_and_opening_files.asp



  • miller_m schrieb:

    ich finde dein ansatz etwas verwirrend 😃
    setzt du den schreibschutz ?

    Hallo,
    Danke erstmal. Es mag sein, dass der Ansatz verwirrend ist; ist das erste Mal, dass ich mit Files unter C++ zu tun habe...
    Ja, ich setze (oder entferne) den Schreibschutz mit SetFileAttributes(...), bevor ich die Datei öffne.
    Mein Problem war, dass jede Datei mit der für sie zuständigen Anwendung geöffnet werden soll, und das scheint nur mit ShellExecute(...) zu funktionieren.
    Ich werde versuchen, CreateFile(...) aus Deinem Vorschlag nur dazu zu verwenden, festzustellen, ob die Datei bereits geöffnet ist.
    Ich werde dann berichten, ob's geklappt hat oder ob ich mich zu sehr anstelle 😃 .

    Viele Grüße
    Peter



  • Hallo,

    so jetzt hab' ich es geschafft. Danke nochmal, dass Du mich mit der Nase drauf gestoßen hast 😃 .

    Ob die Datei offen ist, läßt sich folgendermaßen prüfen:

    HFILE hFile = OpenFile(cstrPath + cstrName, &ofStruct, OF_WRITE);
    
    if (hFile != HFILE_ERROR)
    {
      /*...Datei ist nicht geöffnet, auch sonst keine Probleme, also tu', was zu tun
      ist...*/
    }
    

    Wenn der Rückgabewert von OpenFile(...) == HFILE_ERROR ist, kann man über GetLastError(...) herausfinden, warum's nicht funktioniert.
    In meinem Fall reicht es allerdings aus, einfach den HFILE_ERROR zu prüfen.

    Viele Grüße
    Peter


Anmelden zum Antworten