## Migrating from GnomeVFS to GIO

Table 2. Comparison of GnomeVFS and GIO concepts

GnomeVFS | GIO
--- | ---
GnomeVFSURI | GFile
GnomeVFSFileInfo | GFileInfo
GnomeVFSResult | GError, with G_IO_ERROR values
GnomeVFSHandle & GnomeVFSAsyncHandle | GInputStream or GOutputStream
GnomeVFSDirectoryHandle | GFileEnumerator
mime type | content type
GnomeVFSMonitor | GFileMonitor
GnomeVFSVolumeMonitor | GVolumeMonitor
GnomeVFSVolume | GMount
GnomeVFSDrive | GVolume
- | GDrive
GnomeVFSContext | GCancellable
gnome_vfs_async_cancel | g_cancellable_cancel

## Trash handling

The handling of trashed files has been changed in GIO, compared to gnome-vfs. gnome-vfs has a home-grown trash implementation that predates the freedesktop.org Desktop Trash Can specification that is implemented in GIO. The location for storing trashed files has changed from `$HOME/.Trash` to `$HOME/.local/share/Trash` (or more correctly `$XDG_DATA_HOME/Trash`), which means that there is a need for migrating files that have been trashed by gnome-vfs to the new location.

In gnome-vfs, the `trash://` scheme offering a merged view of all trash directories was implemented in nautilus, and trash-handling applications had to find and monitor all trash directories themselves. With GIO, the `trash://` implementation has been moved to gvfs and applications can simply monitor that location:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34

    static void
    file_changed (GFileMonitor      *file_monitor,
                  GFile             *child,
                  GFile             *other_file,
                  GFileMonitorEvent  event_type,
                  gpointer           user_data)
    {
      switch (event_type)
      {
      case G_FILE_MONITOR_EVENT_DELETED:
        g_print ("'%s' removed from trash\n", g_file_get_basename (child));
        break;
      case G_FILE_MONITOR_EVENT_CREATED:
        g_print ("'%s' added to trash\n", g_file_get_basename (child));
        break;
      default: ;
      }
    }

    static void
    start_monitoring_trash (void)
    {
      GFile *file;
      GFileMonitor *monitor;

      file = g_file_new_for_uri ("trash://");
      monitor = g_file_monitor_directory (file, 0, NULL, NULL);
      g_object_unref (file);

      g_signal_connect (monitor, "changed", G_CALLBACK (file_changed), NULL);

      /* ... */

    }

GIO exposes some useful metadata about trashed files. There are trash::orig-path and trash::deletion-date attributes. The standard::icon attribute of the `trash://` itself provides a suitable icon for displaying the trash can on the desktop. If you are using this icon, make sure to monitor this attribute for changes, since the icon may be updated to reflect that state of the trash can.

Moving a file to the trash is much simpler with GIO. Instead of using `gnome_vfs_find_directory()` with `GNOME_VFS_DIRECTORY_KIND_TRASH` to find out where to move the trashed file, just use the `g_file_trash()` function.