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

import sys
import gnomevfs as vfs

if len(sys.argv) != 3:
    sys.exit("Usage: %s source target" % __file__)

src_uri =  vfs.URI(vfs.make_uri_from_shell_arg(sys.argv[1]))
dst_uri =  vfs.URI(vfs.make_uri_from_shell_arg(sys.argv[2]))

print src_uri, '->', dst_uri

vfs.xfer_uri(src_uri, dst_uri,
             vfs.XFER_DEFAULT,
             vfs.XFER_ERROR_MODE_ABORT,
             vfs.XFER_OVERWRITE_MODE_ABORT)

De ese listado todo es autoexplicativo excepto la función xfer_uri(). El prototipo de esa función es:

gnomevfs.xfer_uri(source_uri, target_uri, options, error_mode, overwrite_mode, progress_callback, data)

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:

$ python vfs-copy.py /home/david/.bashrc mybashrc
file:///home/david/.bashrc -> file:///home/david/devel/mybashrc

$ python vfs-copy.py ftp://ftp.rediris.es/welcome.msg welcome
ftp://ftp.rediris.es/welcome.msg -> file:///home/david/devel/welcome

$ python vfs-copy.py http://ftp.gnu.org/pub/gnu/a2ps/a2ps-4.12.tar.gz#gzip:#tar:/a2ps-4.12/FAQ faq
http://ftp.gnu.org/pub/gnu/a2ps/a2ps-4.12.tar.gz#gzip:/#tar:/a2ps-4.12/FAQ -> file:///home/david/devel/faq

$ python vfs-copy.py ftp://ftp.rediris.es/welcome.msg sftp://david:miclave@miservidor.dyndns.org:/home/david/mensaje
ftp://ftp.rediris.es/welcome.msg -> sftp://david:miclave@miservidor.dyndns.org:/home/david/mensaje

Referencias



blog comments powered by Disqus