GNOME VFS con Python

gnomePython

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

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de brue

Gracias

Sólo la he leido por encima, pero me interesa mucho. Gracias por la receta!


PPC: int main(){long foo=1649571173;puts(&foo);}
x86: int main(){long foo=1702187618;puts(&foo);}

brue