prüfen ob eine Datei geöffnet ist (vor dem Verschieben)



  • Hallo zusammen,

    ich hbae ein Programm geschrieben um eine vom Benutzer ausgewählte Datei nach einem vorgegebenen Schema umzubenennen und zu verschieben.
    Vor dem Umbenennen/Verschieben prüfe ich, ob die Datei noch existiert und ob sich eine Datei mit dem selben Namen am neuen Ort befindet.
    Probleme gibt es na klar, solange der Benutzer die Datei während des Verschiebens geöffnet hat. Welche Möglichkeiten gibt es, zu prüfen, ob die ausgwählte Datei geöffnet ist?
    Ich vermute (und hoffe), es müsste eine einfache Lösung geben, da Windows vor jedem kopieren genau dies prüft.

    Leider bin ich trotz ausführlicher Recherchen nicht auf eine Lösung gestoßen und wäre deshalb um jede Hilfe sehr dankbar...

    Programmiert wird eine Windows Forms Anwendung unter Visual Studio 2015 in C++ (ich habe den ausfürlichen Kommentar darüber im Forum gelesen).



  • Solche Dinge sollte man nicht vorher prüfen, sondern einfach versuchen und wenns nicht geht wird man informiert (z. B. über Exceptions). Dieses Vorgehen ist deshalb sinnvoll, weil die Prüfung zu einem Zeitpunkt ergeben kann, dass es Ok ist etwas zu tun, im nächsten Moment trifft das aber nicht mehr zu, weil z. B. der Benutzer im "falschen" Moment die Datei gelöscht/geöffnet/whatever hat.

    Schau mal hier:
    https://msdn.microsoft.com/en-us/library/system.io.file.move(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2

    Am besten einfach ausprobieren, wie sich das System verhält und die entsprechenden Exceptions behandeln.



  • klar, das prüfe ich auch hinterher.
    Das Problem ist, daass das Programm abstürzt wenn die Datei noch geöffnet ist. Die Prüfung ob die Datei noch geöffnet ist würde unmittelbar vor dem umbenennen stattfinden (in der selben Funktion).
    Meine Funktion ist ähnlich aufgebaut wie die aus der verlinkten MSDN-Doku



  • lk789 schrieb:

    Das Problem ist, daass das Programm abstürzt wenn die Datei noch geöffnet ist.

    Dann hat entweder die Windows-API oder Dein Programm einen Bug. Welches davon hälst Du für wahrscheinlicher?

    Die Prüfung ob die Datei noch geöffnet ist würde unmittelbar vor dem umbenennen stattfinden (in der selben Funktion).

    "unmittelbar davor" gibt es nicht. Es gibt nur "davor" und "gleichzeitig". "Davor" ist zu früh.



  • Dann hat entweder die Windows-API oder Dein Programm einen Bug. Welches davon hälst Du für wahrscheinlicher?

    Das kann ich leider nicht sagen...
    Als Fehlermeldung erhalte ich:
    Ein Ausnahmefehler des Typs "System.IO.IOException" ist in mscorlib.dll aufgetreten.

    Zusätzliche Informationen: Der Prozess kann nicht auf die Datei zugreifen, da sie bereits von einem anderen Prozess verwendet wird.

    "unmittelbar davor" gibt es nicht. Es gibt nur "davor" und "gleichzeitig". "Davor" ist zu früh.

    Dann gleichzeitig. Der Nutzer hat nicht die Möglichkeit so schnell die Datei zu öffnen wie das Umbenennen auf die Prüfung, ob die Datei geöffnet ist, erfolgt.



  • lk789 schrieb:

    Als Fehlermeldung erhalte ich:
    Ein Ausnahmefehler des Typs "System.IO.IOException" ist in mscorlib.dll aufgetreten.

    thetas Antwort gibt es eigentlich nichts hinzuzufügen.

    lk789 schrieb:

    Dann gleichzeitig. Der Nutzer hat nicht die Möglichkeit so schnell die Datei zu öffnen wie das Umbenennen auf die Prüfung, ob die Datei geöffnet ist, erfolgt.

    Erstens ist der Nutzer nicht der einzige, der Dateien öffnen kann. Zweitens kann zwischen diesen beiden Anweisungen in deinem Programm beliebig viel anderer Mist passieren. Das kannst du nicht verhindern. Es gibt kein "unmittelbar davor". Aber auch das steht schon hier.



  • lk789 schrieb:

    Dann gleichzeitig. Der Nutzer hat nicht die Möglichkeit so schnell die Datei zu öffnen wie das Umbenennen auf die Prüfung, ob die Datei geöffnet ist, erfolgt.

    Gleichzeitig heisst in diesem Fall, dass Du ohne Überprüfung versuchst die Datei umzubenennen und das System prüft für Dich, ob es möglich ist. Falls es nicht möglich ist, wird eben genau eine Exception geworfen, die Du behandeln kannst/musst. Dass der Benutzer zu wenig schnell ist, mag in deinem Fall zutreffen, aber sauber ist es nicht - es besteht prinzipiell die Gefahr, dass sich zwischen Überprüfung und Aktion die Lage geändert hat. Ganz zu schweigen davon, dass es vermutlich nicht mal so einfach ist, herauszufinden, ob die Datei umbenennt werden kann.

    lk789 schrieb:

    Ein Ausnahmefehler des Typs "System.IO.IOException" ist in mscorlib.dll aufgetreten.

    Genau da musst Du ansetzen. Diese und die anderen in der Dokumentation aufgeführte Exceptions musst Du behandeln (try/catch) und etwas sinnvolles tun. Etwas sinnvolles ist das, was Du auch in deiner vorgängigen Überprüfung im negativen Fall tun würdest.



  • Alles klar, jetzt weiß ich was ihr meint...ich stand ein wenig auf dem Schlauch.
    Bisher habe ich noch nicht mit Exceptions gearbeitet aber ich habe da von der Uni noch was im Hinterkopf

    vielen Dank für die Hilfe!