Seite 1 von 1

Prüfen, ob man eine Datei speichern kann

Verfasst: Montag 21. Oktober 2019, 14:01
von DMD-OS
hi
ich würde überprüfen, ob eine datei geöffnet ist oder nicht, damit ich entweder sagen kann,
"Bitte vorher Datei schließen" oder alles ok, Änderungen können abgespeichert werden.

Re: Prüfen, ob man eine Datei speichern kann

Verfasst: Montag 21. Oktober 2019, 14:23
von __deets__
Solltest du nicht machen. Selbst wenn du es koenntest - das kann sich in dem Moment zwischen testen, und dann schreiben, geaendert haben. Darum musst du eh immer den Fehler abfangen wenn es nicht geklappt hat, und das ist auch das Signal auf das du hoeren kannst um dem User zu sagen "bitte sicherstellen, dass es geht".

Re: Prüfen, ob man eine Datei speichern kann

Verfasst: Montag 21. Oktober 2019, 14:34
von DMD-OS
also einfach try?

Code: Alles auswählen

try:
    writer.save()
except:
    print("Bitte die Datei schließen.")
Allerdings möchte ich gern vor programmstart fragen, ob die noch geöffnet ist, damit
das script nicht ganz durchlaufen werden muß, um dann festzustellen SCHEISSE

Re: Prüfen, ob man eine Datei speichern kann

Verfasst: Montag 21. Oktober 2019, 14:49
von __deets__
Niemals nackte except benutzen. Exceptions immer spezifisch abfangen. Und wie willst du denn *vor* Programmstart abfragen, ob es geht? Dann laeuft doch kein Code, bevor dein Programm laeuft 🤷‍♂️

Und wie gesagt, es BRINGT nix, vorher zu pruefen, ob das schon geoeffnet ist. In dem Moment, wo du es wirklich probierst, kann es trotz vorheriger Pruefung passiert sein, das es geoeffnet wurde. zB weil der Windows Virenscanner darueber laeuft, nachdem das Programm das die Datei vorher geoeffnet hatte beendet wurde. Das ist also keine verlaessliche Aussage. Alles was funktioniert ist, es wirklich zu probieren, und dann bei fehlschlagen es einfach nochmal zu probieren. Ggf. eben mit einer Dialogbox die sagt "bitte Datei schliessen in Programmen, die sie benutzen koennten". Aber eine Garantie das das Erfolg hat gibt's eben nicht. Unser Code fuer Windows in der Anwendung die wir vertreiben probiert auch x-mal eine Datei zu loeschen, mit kurzer Pause dazwischen. Weil das unter Windows nicht anders geht.

Re: Prüfen, ob man eine Datei speichern kann

Verfasst: Montag 21. Oktober 2019, 15:12
von DeaD_EyE
Fast genau so:

Code: Alles auswählen

def is_locked(file):
    try:
        with open(file, 'r+b'):
            return False
    except:
        return True

Als Mode müsste auch a ausreichen, w+ würde die Datei abschneiden, falls das Öffnen geklappt hat.
Wenn du wissen willst, welche Excpetion genau geworfen wird:

Code: Alles auswählen

def is_locked(file):
    try:
        with open(file, 'r+b'):
            return False
    except Exception as e:
        print('Error:', e, 'Type':, type(e))
        return True

Wenn du dann genau weißt welche Exception das ist, kannst du spezifisch danach abfangen.
Die Funktion sollte z.B. eine Exception werfen, wenn die Datei nicht existiert.
Du willst ja nur prüfen ob die Datei bereits geöffnet ist und für den Schreibzugriff gesperrt worden ist.

Re: Prüfen, ob man eine Datei speichern kann

Verfasst: Montag 21. Oktober 2019, 16:56
von Sirius3
@DeaD_EyE: und neben dem, was __deets__ bereits geschrieben hat, kann es sein, dass nur Teile der Datei gelockt sind und daher das einfache Öffnen keinen Fehler wirft.

@DMD-OS: was sind denn die genauen Fälle, die Du abprüfen willst. Also, aus welchem Grund könnte die Datei bereits geöffnet sein und welche Varianten gibt es, wie man darauf reagieren könnte?

Re: Prüfen, ob man eine Datei speichern kann

Verfasst: Mittwoch 23. Oktober 2019, 12:17
von DeaD_EyE
@Sirius3: Das geht? Ich dachte Windows lockt die ganze Datei.

Re: Prüfen, ob man eine Datei speichern kann

Verfasst: Mittwoch 23. Oktober 2019, 13:01
von __blackjack__
Hier ist die Doku für LockFile: https://docs.microsoft.com/en-us/window ... i-lockfile

Signatur:

Code: Alles auswählen

BOOL LockFile(
  HANDLE hFile,
  DWORD  dwFileOffsetLow,
  DWORD  dwFileOffsetHigh,
  DWORD  nNumberOfBytesToLockLow,
  DWORD  nNumberOfBytesToLockHigh
);
Das man die beiden 64-Bit-Werte für Offset und Byteanzahl als vier 32-Bit-Werte angeben muss ist, äh, interessant. 😵