Operaciones básicas

Las operaciones básicas que se pueden realizar con GNOME-VFS son las que cabe esperar de cualquier librería de E/S. Es decir, abrir ficheros, leerlos, modificarlos, todo ello a través de funciones que siguen la nomenclatura del estándar POSIX de E/S.

Así, por ejemplo, para abrir un fichero alojado en el servidor FTP de GNOME, se usaría el siguiente fragmento de código:

      GnomeVFSHandle *handle = NULL;
      gchar buffer[128];
      GnomeVFSFileSize leidos;

      gnome_vfs_open (&handle, "ftp://ftp.gnome.org/gnumeric.deb", GNOME_VFS_OPEN_READ);
      gnome_vfs_read (handle, buffer, sizeof (buffer) - 1, &leidos);
      g_print ("Se leyeron %d bytes:\n%s\n\n", leidos, buffer);
    

Como se puede observar en este ejemplo, el API de GNOME-VFS es muy parecido al del sistema POSIX de E/S de C (las funciones close, read, write, etc). Y, de hecho, ésto no es fortuíto, sino que ha sido intencionado el que el API fuese lo más parecida posible, para así facilitar los cambios necesarios en las aplicaciones para pasar del sistema POSIX a GNOME-VFS.

En este ejemplo, se puede observar que no es necesario usar ninguna variable de tipo GnomeVFSURI, como comentábamos en el punto anterior. Ésto es así porque se ha querido simplificar el ejemplo al máximo, y para ello se ha usado una de las múltiples funciones de GNOME-VFS, en este caso gnome_vfs_open, que permite directamente especificar el URI en una cadena de texto. Así que, usando GnomeVFSURI, el código anterior se traduciría de la siguiente manera:

      GnomeVFSURI *uri;
      GnomeVFSHandle *handle;

      uri = gnome_vfs_uri_new ("ftp://ftp.gnome.org/gnumeric.deb");
      gnome_vfs_open_uri (&handle, uri, GNOME_VFS_OPEN_READ);
      ...
    

Así, como puede verse, se dispone de un sistema de manejo de recursos muy sencillo de usar, al ser parecido al sistema al que ya se usaba antes. Por ello, siguiendo con las similitudes con el estándar POSIX, éstas son las funciones de E/S básicas de las que se dispone en GNOME-VFS.

GnomeVFSResult gnome_vfs_open (GnomeVFSHandle **handle,
                                             const gchar *text_uri,
                                             GnomeVFSOpenMode open_mode);
GnomeVFSResult gnome_vfs_open_uri (GnomeVFSHandle **handle,
                                             GnomeVFSURI *uri,
                                             GnomeVFSOpenMode open_mode);
GnomeVFSResult gnome_vfs_create (GnomeVFSHandle **handle,
                                             const gchar *text_uri,
                                             GnomeVFSOpenMode open_mode,
                                             gboolean exclusive,
                                             guint perm);
GnomeVFSResult gnome_vfs_create_uri (GnomeVFSHandle **handle,
                                             GnomeVFSURI *uri,
                                             GnomeVFSOpenMode open_mode,
                                             gboolean exclusive,
                                             guint perm);
GnomeVFSResult gnome_vfs_close (GnomeVFSHandle *handle);
GnomeVFSResult gnome_vfs_read (GnomeVFSHandle *handle,
                                             gpointer buffer,
                                             GnomeVFSFileSize bytes,
                                             GnomeVFSFileSize *bytes_read);
GnomeVFSResult gnome_vfs_write (GnomeVFSHandle *handle,
                                             gconstpointer buffer,
                                             GnomeVFSFileSize bytes,
                                             GnomeVFSFileSize *bytes_written);
GnomeVFSResult gnome_vfs_seek (GnomeVFSHandle *handle,
                                             GnomeVFSSeekPosition whence,
                                             GnomeVFSFileOffset offset);
GnomeVFSResult gnome_vfs_tell (GnomeVFSHandle *handle,
                                             GnomeVFSFileSize *offset_return);
GnomeVFSResult gnome_vfs_get_file_info (const gchar *text_uri,
                                             GnomeVFSFileInfo *info,
                                             GnomeVFSFileInfoOptionsoptions);
GnomeVFSResult gnome_vfs_get_file_info_uri (GnomeVFSURI *uri,
                                             GnomeVFSFileInfo *info,
                                             GnomeVFSFileInfoOptionsoptions);
GnomeVFSResult gnome_vfs_get_file_info_from_handle
(GnomeVFSHandle *handle,
                                             GnomeVFSFileInfo *info,
                                             GnomeVFSFileInfoOptionsoptions);
GnomeVFSResult gnome_vfs_truncate (const gchar *text_uri,
                                             GnomeVFSFileSize length);
GnomeVFSResult gnome_vfs_truncate_uri (GnomeVFSURI *uri,
                                             GnomeVFSFileSize length);
GnomeVFSResult gnome_vfs_truncate_handle (GnomeVFSHandle *handle,
                                             GnomeVFSFileSize length);
GnomeVFSResult gnome_vfs_make_directory_for_uri
(GnomeVFSURI *uri,
                                             guint perm);
GnomeVFSResult gnome_vfs_make_directory (const gchar *text_uri,
                                             guint perm);
GnomeVFSResult gnome_vfs_remove_directory_from_uri
(GnomeVFSURI *uri);
GnomeVFSResult gnome_vfs_remove_directory (const gchar *text_uri);
GnomeVFSResult gnome_vfs_unlink_from_uri (GnomeVFSURI *uri);
GnomeVFSResult gnome_vfs_create_symbolic_link
(GnomeVFSURI *uri,
                                             const gchar *target_reference);
GnomeVFSResult gnome_vfs_unlink (const gchar *text_uri);
GnomeVFSResult gnome_vfs_move_uri (GnomeVFSURI *old_uri,
                                             GnomeVFSURI *new_uri,
                                             gboolean force_replace);
GnomeVFSResult gnome_vfs_move (const gchar *old_text_uri,
                                             const gchar *new_text_uri,
                                             gboolean force_replace);
GnomeVFSResult gnome_vfs_check_same_fs_uris (GnomeVFSU
    

Es una larga lista de operaciones que cubre todas las tareas básicas de E/S, como son la lectura/escritura (_read/_write), la búsqueda dentro del fichero (_seek), la obtención de información sobre el recurso (_get_file_info), etc, aparte de otra serie de funciones de más alto nivel que permiten hacer todo tipo de operaciones con URIs. Como también se puede observar, se ofrecen funciones para cada operación de forma que se puedan usar en esas operaciones tanto simples cadenas de texto representando un URI, como objetos GnomeVFSURI como GnomeVFSHandle (que es el equivalente a los descriptores de ficheros en el sistema POSIX).

Es importante destacar que gran parte de estas funciones devuelven un valor de tipo GnomeVFSResult, que es un tipo definido en los ficheros de cabecera de GNOME-VFS que puede contener distintos valores, cada uno de los cuales especifican una condición de error especial. En cualquiera de los casos, aunque en los ejemplos que aquí se muestra no aparezca, es conveniente comprobar, tras cada llamada a las funciones de GNOME-VFS el valor devuelto, y actuar en consecuencia.