Prüfen, ob man eine Datei speichern kann

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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".
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

@Sirius3: Das geht? Ich dachte Windows lockt die ganze Datei.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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. 😵
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten