¿Cómo verificar si se puede crear un archivo dentro de un directorio determinado en MS XP / Vista?

Tengo un código que crea archivos en el directorio especificado por el usuario. El usuario puede apuntar a un directorio en el que no puede crear archivos, pero puede cambiar su nombre.

He creado el directorio para propósitos de prueba, llamémoslo C:\foo .

Tengo los siguientes permisos para C:\foo :

  • Atravesando directorio / Ejecutar archivo
  • Eliminar subcarpetas y archivos
  • Removiendo
  • Permisos de lectura
  • Cambiar permisos
  • Tomar posesión

No tengo ninguno de los siguientes permisos para C:\foo :

  • Control total
  • Creación de archivos
  • Creación de carpeta

He intentado los siguientes enfoques, hasta ahora:


    os.access('C:\foo', os.W_OK) == True

    st = os.stat (‘C: \ foo’)
    mode = st [stat.ST_MODE]
    mode & stat.S_IWRITE == True

    Creo que esto se debe al hecho de que puedo cambiar el nombre de la carpeta, por lo que es modificable para mí. Pero es contenido, no.

    ¿Alguien sabe cómo puedo escribir un código que verifique un directorio dado si el usuario actual tiene permisos para crear un archivo en ese directorio?

    En resumen: quiero comprobar si el usuario actual tiene permisos de Creación de archivos y Creación de carpetas para el nombre de carpeta dado.

    EDITAR: La necesidad de dicho código surgió en el caso de prueba nº 3 del progtwig “Certificado para Windows Vista”, que establece:

    1. La aplicación no debe permitir que el usuario con privilegios mínimos guarde ningún archivo en el directorio del sistema de Windows para pasar este caso de prueba.

    ¿Debería entenderse esto como ‘La aplicación puede intentar guardar un archivo en el directorio del sistema de Windows, pero no debería fallar en el fallo?’ o más bien ‘¿La aplicación debe realizar comprobaciones de seguridad antes de intentar guardar el archivo?

    ¿Debo dejar de molestar solo porque Windows Vista no permite que el usuario con privilegios mínimos guarde ningún archivo en% WINDIR%?

    Recientemente escribí una aplicación para pasar un conjunto de pruebas para obtener el estado de ISV de Microsoft y también agrego esa condición. La forma en que lo entendí fue que si el usuario es Least Priveledge, entonces no tendrá permiso para escribir en las carpetas del sistema. Así que abordé el problema tal como lo describió Ishmaeel. Intento crear el archivo y detectar la excepción y luego informar al usuario que no tiene permiso para escribir archivos en ese directorio.

    Según tengo entendido, un usuario con privilegios mínimos no tendrá los permisos necesarios para escribir en esas carpetas, si tiene, entonces no es un usuario con privilegios mínimos.

    ¿Debo dejar de molestar solo porque Windows Vista no permite que el usuario con privilegios mínimos guarde ningún archivo en% WINDIR%?

    ¿En mi opinión? Sí.

    No malgastaría el tiempo y las LOC en la comprobación de permisos. La última prueba de creación de archivos en Windows es la creación misma. Otros factores pueden entrar en juego (como los archivos existentes (o, lo que es peor, las carpetas) con el mismo nombre, espacio en disco y procesos en segundo plano. Estas condiciones pueden incluso cambiar entre el momento en que realiza la comprobación inicial y el momento en que realmente intenta crear su expediente.

    Entonces, si tuviera un escenario como ese, solo diseñaría mi método para no perder ningún dato en caso de falla, seguir adelante e intentar crear mi archivo, y ofrecerle al usuario la opción de cambiar el directorio seleccionado e intentarlo de nuevo si la creación falla

    Estoy de acuerdo con las otras respuestas en que la forma de hacerlo es intentar crear el archivo y capturar la excepción.

    Sin embargo , en Vista ten cuidado con UAC! Vea, por ejemplo, “¿Por qué mi aplicación me permite guardar archivos en las carpetas de Windows y System32 en Vista?” : Para admitir aplicaciones antiguas, Vista “simulará” crear el archivo, mientras que en realidad lo crea en la llamada Tienda virtual bajo el perfil del usuario actual.

    Para evitar esto, debe decirle específicamente a Vista que no desea privilegios administrativos, al incluir los comandos apropiados en el manifiesto .exe, vea la pregunta vinculada anteriormente.

     import os import tempfile def can_create_file(folder_path): try: tempfile.TemporaryFile(dir=folder_path) return True except OSError: return False def can_create_folder(folder_path): try: name = tempfile.mkdtemp(dir=folder_path) os.rmdir(name) return True except OSError: return False