Saltar al contenido

IOError: [Errno 13] Permiso denegado al intentar abrir un archivo oculto en modo “w”

Hola, descubrimos la respuesta a tu interrogante, has scroll y la obtendrás aquí.

Solución:

Así es como funciona la API de Win32. Debajo del capó, Python open función está llamando a la CreateFile función, y si eso falla, traduce el código de error de Windows en un Python IOError.

Él r+ el modo abierto corresponde a un dwAccessMode de GENERIC_READ|GENERIC_WRITE y un dwCreationDisposition de OPEN_EXISTING. Él w el modo abierto corresponde a un dwAccessMode de GENERIC_WRITE y un dwCreationDisposition de CREATE_ALWAYS.

Si lee atentamente los comentarios en el CreateFile documentación, dice esto:

Si CREATE_ALWAYS y FILE_ATTRIBUTE_NORMAL se especifican, CreateFile falla y establece el último error en ERROR_ACCESS_DENIED si el archivo existe y tiene el FILE_ATTRIBUTE_HIDDEN o FILE_ATTRIBUTE_SYSTEM attribute. Para evitar el error, especifique el mismo attributes como el archivo existente.

Así que si estuvieras llamando CreateFile directamente desde el código C, la solución sería agregar FILE_ATTRIBUTE_HIDDEN hacia dwFlagsAndAttributes parámetro (en lugar de sólo FILE_ATTRIBUTE_NORMAL). Sin embargo, dado que no hay ninguna opción en la API de Python para indicarle que pase ese indicador, solo tendrá que solucionarlo utilizando un modo de apertura diferente o haciendo que el archivo no esté oculto.

Aquí están las diferencias detalladas: –

“r” Abrir archivo de texto para lectura. La secuencia se coloca al principio del archivo.

“r+” Abierto para lectura y escritura. La secuencia se coloca al principio del archivo.

“w” Trunca el archivo a cero o crea un archivo de texto para escribir. La secuencia se coloca al principio del archivo.

“w+” Abierto para lectura y escritura. El archivo se crea si no existe, de lo contrario se trunca. La secuencia se coloca al principio del archivo.

“a” Abierto para escribir. El archivo se crea si no existe. La secuencia se coloca al final del archivo. Las escrituras subsiguientes en el archivo siempre terminarán en el final actual del archivo, independientemente de cualquier fseek(3) intermedio o similar.

“a+” Abierto para lectura y escritura. El archivo se crea si no existe. La secuencia se coloca al final del archivo. Las escrituras subsiguientes en el archivo siempre terminarán en el final actual del archivo, independientemente de cualquier intervención fseek(3) o similar.

De la documentación de Python – http://docs.python.org/2/tutorial/inputoutput.html#reading-and-write-files:-

En Windows, la ‘b’ añadida al modo abre el archivo en modo binario, por lo que también hay modos como ‘rb’, ‘wb’ y ‘r+b’. Python en Windows hace una distinción entre archivos de texto y binarios; los caracteres de final de línea en los archivos de texto se modifican automáticamente cuando se leen o escriben datos. Esta modificación detrás de escena de los datos del archivo está bien para los archivos de texto ASCII, pero corromperá los datos binarios como los de los archivos JPEG o EXE. Tenga mucho cuidado de usar el modo binario cuando lea y escriba dichos archivos. En Unix, no está de más agregar una ‘b’ al modo, por lo que puede usarlo independientemente de la plataforma para todos los archivos binarios.

Así que si estás usando w modo, en realidad está tratando de crear un archivo y es posible que no tenga los permisos para hacerlo. r+ es la elección adecuada.

Si se encuentra en una situación en la que aún no sabe dónde está su .picasi.ini existe o no y su usuario de Windows tiene permisos de creación de archivos en ese directorio y desea agregar nueva información en lugar de comenzar al principio del archivo (también conocido como “agregar”), entonces a+ será la elección adecuada.

No tiene nada que ver con si su archivo está oculto o no.

Puedes añadir valor a nuestra información asistiendo con tu experiencia en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *