IOError: [Errno 13] Permission refusée en essayant d'ouvrir un fichier caché en mode "w"

je veux remplacer le contenu d'un fichier caché, donc j'ai essayé de l'ouvrir dans w mode de sorte qu'il serait effacée/tronquée:

>>> 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')

Mais ce qui a entraîné un traceback:

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

cependant, j'ai pu atteindre le résultat prévu avec r+ mode:

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

Q. Quelle est la différence entre w et r+ modes, tels que l'un a "permission denied" mais l'autre fonctionne amende?

mise à jour: je suis sur win7 x64 en utilisant Python 2.6.6, et le fichier cible a ses attributs cachés. Quand j'ai essayé de désactiver l'attribut caché, w mode réussit. Mais quand je le rallume, il échoue à nouveau.

Q. Pourquoi w le mode échoue sur les fichiers cachés? Est-ce comportement connu?

21
demandé sur zedex 2012-11-04 07:08:58

2 réponses

c'est exactement comme ça que fonctionne L'API Win32. Sous le capot, Python est open la fonction appelle le CreateFile fonction, et si cela échoue, il traduit le code d'erreur Windows en Python IOError.

r+ le mode ouvert correspond à un dwAccessModeGENERIC_READ|GENERIC_WRITE et dwCreationDispositionOPEN_EXISTING. w le mode ouvert correspond à un dwAccessModeGENERIC_WRITE et dwCreationDispositionCREATE_ALWAYS.

Si vous lisez attentivement les remarques dans le CreateFile de la documentation, il est dit ceci:

Si CREATE_ALWAYS et FILE_ATTRIBUTE_NORMAL est spécifié, CreateFile échoue et définit la dernière erreur ERROR_ACCESS_DENIED si le fichier existe et a l' FILE_ATTRIBUTE_HIDDEN ou FILE_ATTRIBUTE_SYSTEM l'attribut. Pour éviter l'erreur, spécifiez les mêmes attributs que le fichier existant.

donc si vous appeliez CreateFile directement à partir du code C, la solution serait d'ajouter dans FILE_ATTRIBUTE_HIDDENdwFlagsAndAttributes paramètre (au lieu de simplement les FILE_ATTRIBUTE_NORMAL). Cependant, comme il n'y a pas de option dans L'API Python pour lui dire de passer dans ce flag, vous aurez juste à contourner en utilisant un mode ouvert différent ou en rendant le fichier non caché.

27
répondu Adam Rosenfield 2012-11-04 04:11:03

Voici les différences détaillées: -

`r" ouvrir le fichier texte pour lecture. Le flux est positionné à la début du fichier.

`r+" Ouvert pour la lecture et l'écriture. Le flux est positionné à le début du fichier.

`w" tronquer le fichier à longueur zéro ou créer le fichier texte pour l'écriture. Le flux est placé au début du fichier.

"w+" ouvert pour la lecture et l'écriture. Le fichier est créé si il n' pas exister, sinon il est tronqué. Le flux est positionné à le début du fichier.

`a" Ouvert pour l'écriture. Le fichier est créé s'il n'existe pas. Le flux est placé à la fin du fichier. Les écritures suivantes le fichier sera toujours au courant à la fin du fichier, indépendamment de tout fseek(3) ou similaire.

`+" Ouvert pour la lecture et l'écriture. Le fichier est créé si il n' pas exister. Le flux est placé à la fin du fichier. Subse- quent écrit dans le fichier finiront toujours au courant fin du fichier, indépendamment de tout fseek(3) ou similaire.

à Partir de la documentation python - http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files:-

sur Windows, ' b ' ajouté au mode ouvre le fichier en mode binaire, donc il y a aussi des modes comme "rb", "wb", et "r+b". Python sur Windows fait une distinction entre le texte et les fichiers binaires; la fin-de-ligne les caractères dans des fichiers texte sont automatiquement modifiés légèrement lorsque les données est lu ou écrit. Cette modification en coulisse des données du fichier c'est bien pour les fichiers texte ASCII, mais ça corrompt les données binaires comme ça. dans les fichiers JPEG ou EXE. Soyez très prudent d'utiliser le mode binaire lors de la lecture et l'écriture de ces fichiers. Sur Unix, ça ne fait pas de mal d'ajouter un " b " à le mode, de sorte que vous pouvez utiliser la plate-forme informatique-indépendamment pour tous les binaires fichier.

Donc, si vous utilisez w mode, vous essayez en fait de créer un fichier et vous n'avez peut-être pas les permissions pour le faire. r+ est le choix approprié.

Si vous êtes dans une situation où vous ne savez pas encore où votre .picasi.ini existe ou non et votre utilisateur windows a des permissions de création de fichier dans ce répertoire et vous voulez ajouter de nouvelles informations au lieu de commencer au début du fichier (a. K. a "ajoute"), puis a+ sera le bon choix.

cela n'a rien à voir avec le fait que votre fichier soit caché ou non.

4
répondu Calvin Cheng 2012-11-04 03:27:10