webentwicklung-frage-antwort-db.com.de

IOError: [Errno 13] Berechtigung verweigert, wenn versucht wird, versteckte Datei im "w" -Modus zu öffnen

Ich möchte den Inhalt einer versteckten Datei ersetzen und habe versucht, sie im w -Modus zu öffnen, damit sie gelöscht/abgeschnitten wird:

>>> import os
>>> ini_path = '.picasa.ini'
>>> os.path.exists(ini_path)
True
>>> os.access(ini_path, os.W_OK)
True
>>> ini_handle = open(ini_path, 'w')

Dies führte jedoch zu einem Traceback:

IOError: [Errno 13] Permission denied: '.picasa.ini'

Das angestrebte Ergebnis konnte ich jedoch mit r+ Modus:

>>> ini_handle = open(ini_path, 'r+')
>>> ini_handle.truncate()
>>> ini_handle.write(ini_new)
>>> ini_handle.close()

Q. Was ist der Unterschied zwischen w und r+ Modi, so dass einer "Erlaubnis verweigert" hat, aber der andere gut funktioniert?

PDATE: Ich bin auf win7 x64 mit Python 2.6.6, und für die Zieldatei wurde ein verstecktes Attribut festgelegt. Als ich versuchte, das versteckte Attribut auszuschalten, wurde w-Modus ist erfolgreich, aber wenn ich ihn wieder einschalte, schlägt er erneut fehl.

F. Warum schlägt der w -Modus bei versteckten Dateien fehl? Ist dieses Verhalten bekannt?

22
zedex

So funktioniert die Win32-API. Unter der Haube ruft Pythons Funktion open die Funktion CreateFile auf. Wenn dies fehlschlägt, übersetzt sie den Windows-Fehlercode in ein Python. IOError.

Der Öffnungsmodus r+ Entspricht einem dwAccessMode von GENERIC_READ|GENERIC_WRITE Und einem dwCreationDisposition von OPEN_EXISTING. Der Öffnungsmodus w entspricht einem dwAccessMode von GENERIC_WRITE Und einem dwCreationDisposition von CREATE_ALWAYS.

Wenn Sie die Anmerkungen in der Dokumentation CreateFile sorgfältig lesen, heißt es:

Wenn CREATE_ALWAYS Und FILE_ATTRIBUTE_NORMAL Angegeben sind, schlägt CreateFile fehl und setzt den letzten Fehler auf ERROR_ACCESS_DENIED, Wenn die Datei vorhanden ist und den Zusatz FILE_ATTRIBUTE_HIDDEN Oder enthält Attribut FILE_ATTRIBUTE_SYSTEM. Geben Sie dieselben Attribute wie die vorhandene Datei an, um den Fehler zu vermeiden.

Wenn Sie also CreateFile direkt aus C-Code aufrufen, besteht die Lösung darin, FILE_ATTRIBUTE_HIDDEN Zum Parameter dwFlagsAndAttributes hinzuzufügen (anstatt nur FILE_ATTRIBUTE_NORMAL). Da es jedoch in der Python-API keine Option gibt, die es veranlasst, dieses Flag zu übergeben, müssen Sie es nur umgehen, indem Sie entweder einen anderen Öffnungsmodus verwenden oder die Datei nicht mehr verbergen.

30
Adam Rosenfield

Hier sind die detaillierten Unterschiede: -

`` r '' Textdatei zum Lesen öffnen. Der Stream befindet sich am Anfang der Datei.

`` r + '' Zum Lesen und Schreiben öffnen. Der Stream befindet sich am Anfang der Datei.

`` w '' Datei auf Null Länge kürzen oder Textdatei zum Schreiben erstellen. Der Stream befindet sich am Anfang der Datei.

`` w + '' Zum Lesen und Schreiben öffnen. Die Datei wird erstellt, wenn sie nicht vorhanden ist, andernfalls wird sie abgeschnitten. Der Stream befindet sich am Anfang der Datei.

Zum Schreiben öffnen. Die Datei wird erstellt, wenn sie nicht vorhanden ist. Der Stream befindet sich am Ende der Datei. Nachfolgende Schreibvorgänge in die Datei enden immer am jeweils aktuellen Ende der Datei, unabhängig von einem dazwischen liegenden Suchvorgang (3) oder ähnlichem.

`` a + '' Zum Lesen und Schreiben öffnen. Die Datei wird erstellt, wenn sie nicht vorhanden ist. Der Stream befindet sich am Ende der Datei. Nachfolgende Schreibvorgänge in die Datei enden immer am aktuellen Ende der Datei, unabhängig von einem dazwischenliegenden Suchvorgang (3) oder ähnlichem.

Aus python documentation - http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files:-

Unter Windows wird die Datei im Binärmodus durch Anhängen von "b" geöffnet. Daher gibt es auch Modi wie "rb", "wb" und "r + b". Python unter Windows unterscheidet zwischen Text- und Binärdateien; die Zeilenendezeichen in Textdateien werden automatisch geringfügig geändert, wenn Daten gelesen oder geschrieben werden. Dies ändert sich hinter den Kulissen zu Dateidaten sind in Ordnung für ASCII Textdateien, aber sie beschädigen Binärdaten wie die in JPEG- oder EXE-Dateien. Achten Sie darauf, den Binärmodus beim Lesen und Schreiben solcher Dateien zu verwenden. Unter Unix Es tut nicht weh, ein 'b' an den Modus anzuhängen, sodass Sie es plattformunabhängig für alle Binärdateien verwenden können.

Wenn Sie also den w -Modus verwenden, versuchen Sie tatsächlich, eine Datei zu erstellen, und verfügen möglicherweise nicht über die entsprechenden Berechtigungen. r+ ist die richtige Wahl.

Wenn Sie in einer Situation sind, in der Sie noch nicht wissen, wo Ihr .picasi.ini existiert oder nicht und Ihr Windows-Benutzer hat Dateierstellungsberechtigungen in diesem Verzeichnis und Sie möchten neue Informationen anhängen, anstatt am Anfang der Datei zu beginnen (a.k.a "anhängen"), dann a+ wird die geeignete Wahl sein.

Es hat nichts damit zu tun, ob Ihre Datei versteckt ist oder nicht.

4
Calvin Cheng