GNOME VFS con Python
GNOME
VFS es una librería para realizar todo tipo de operaciones sobre ficheros independientemente del método de acceso necesario para llegar a ellos (FTP, HTTP, WebDAV, SMB, etc). Esta receta muestra ejemplos de lo sencilla y potente que puede llegar a ser esta pequeña maravilla.
Ingredientes
- python-gnome2
- libgnomevfs2-0
- libgnomevfs2-extra
Introducción
GNOME VFS intenta seguir una semántica lo más parecida posible a la de POSIX, de modo que dispone de open, read, write, seek y todas las primitivas que eran de esperar (aunque puede que en la nueva versión esto cambie bastante).
Para designar un fichero o directorio se utilizan URIs que incluyen:
- Un esquema: ftp, sftp, file, etc
- Un nombre de host
- Una ruta
Partiendo de esta base, es posible realizar gran cantidad de operaciones:
- crear, abrir, copiar, mover, borrar, enlazar
- comprobar existencia, permisos y otros atributos
- leer y escribir el contenido
- listar directorios
- transferencias de múltiples ficheros (incluye mover, copiar, enlazar, etc)
- monitorizar ficheros para reaccionar ante cambios
- operaciones asíncronas
- gestión de volúmenes y discos
Además de cuestiones avanzadas como Zeroconf, DNS, SSL, gestión de MIMEs, etc.
En esta receta incluiré pequeños ejemplos que considere lo suficientemente simples y didácticos, así que esta receta irá creciendo con el tiempo, o eso espero.
Un copy
universal
El siguiente programa (llamado vfs-copy.py
) se puede utilizar para copiar cualquier fichero de cualquier sitio a cualquier sitio (siempre que esos sitios sean manejables por GNOME VFS obviamente):
De ese listado todo es autoexplicativo excepto la función xfer_uri()
. El prototipo de esa función es:
que son:
- URIs origen y destino
- operación: copiar, mover, enlazar (ver GnomeVFSXferOptions)
- qué hacer en caso de error
- qué hacer si ya existe el destino
- una función de callback para llamar en caso de error
- datos de usuario asociados al callback
Y ahora vamos a probarlo, todos los comandos siguientes funcionan tal cual con el listado del programa anterior: