python - validar - verificar existencia de archivo en shell
¿Cómo verificar si un archivo se puede crear dentro del directorio dado en MS XP/Vista? (4)
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
Tengo un código que crea archivos en el directorio especificado por el usuario. El usuario puede señalar un directorio en el que no puede crear archivos, pero puede cambiarle el nombre.
He creado un directorio para propósitos de prueba, llamémoslo C:/foo
.
Tengo los siguientes permisos para C:/foo
:
- Recorrido del directorio / Ejecutar archivo
- Eliminar subcarpetas y archivos
- Eliminando
- Permisos de lectura
- Cambiar permisos
- Tomar posesión
No tengo ninguno de los siguientes permisos para C:/foo
:
- Control total
- Creación de archivo
- Creación de carpeta
He intentado seguir enfoques, hasta ahora:
os.access(''C:/foo'', os.W_OK) == True
st = os.stat (''C: / foo'')
mode = st [stat.ST_MODE]
modo & 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 código que buscará un directorio determinado si el usuario actual tiene permisos para crear un archivo en ese directorio?
En resumen: quiero verificar si el usuario actual tiene permisos de creación de archivos y creación de carpetas para el nombre de la carpeta.
EDITAR: La necesidad de dicho código surgió del caso de prueba n. ° 3 del programa ''Certificado para Windows Vista'', que establece:
- La aplicación no debe permitir que el usuario con menos privilegios 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 el archivo en el directorio del sistema de Windows, pero no debería fallar si falla?'' o más bien ''¿La aplicación debe realizar comprobaciones de seguridad antes de intentar guardar el archivo?''
¿Debo dejar de molestarme solo porque Windows Vista no permita que el usuario con menos privilegios guarde ningún archivo en% WINDIR%?
Hace poco escribí una aplicación para pasar un conjunto de pruebas para obtener el estado de ISV de Microsoft y también agregué 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 me acerqué al problema de la manera en que lo describió Ishmaeel. Intento crear el archivo y atrapar la excepción, luego informar al usuario que no tiene permiso para escribir archivos en ese directorio.
Según entiendo, un usuario menos privilegiado no tendrá los permisos necesarios para escribir en esas carpetas; si lo hizo, entonces no es un usuario de Least-Priveledge.
¿Debería dejar de molestarme solo porque Windows Vista no permita que el usuario con menos privilegios guarde ningún archivo en% WINDIR%?
¿En mi opinión? Sí.
No perdería el tiempo ni los LOC en buscar permisos. La última prueba de creación de archivos en Windows es la creación misma. Otros factores pueden entrar en juego (como archivos existentes (o peor, carpetas) con el mismo nombre, espacio en disco, procesos en segundo plano. Estas condiciones pueden incluso cambiar entre el momento en que realiza la verificación inicial y el momento en que realmente intenta crear su archivo.
Entonces, si tuviera un escenario así, simplemente diseñaría mi método para no perder datos en caso de falla, seguir adelante y tratar de crear mi archivo, y ofrecerle al usuario la opción de cambiar el directorio seleccionado e intentar nuevamente si la creación falla
Estoy de acuerdo con las otras respuestas de que la forma de hacerlo es intentar crear el archivo y capturar la excepción.
Sin embargo , en Vista ¡ten cuidado con UAC! Ver 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 de .exe, consulte la pregunta vinculada anteriormente.