Proporcionar ficheros en aplicaciones Metro

En el artículo anterior se ha visto cómo se consumían ficheros desde una aplicación Metro, en este se verá cómo convertir una aplicación existente en un origen de datos para otras aplicaciones

Proporcionando ficheros

La otra cara de trabajar con ficheros permite a nuestras aplicaciones proporcionar archivos directamente de los servicios a los que estén conectados.

¿Qué aplicaciones deberían implementarlo?

En general, cualquier aplicación que trabaje con ficheros, entre las que se puede mencionar, como ejemplo:

  • Redes sociales, para obtener fotos o vídeo directamente.
  • Programas que reciban RSS de vídeo, música o imágenes.
  • Gestores de tareas que almacenen, para cada proyecto, ficheros.
  • Blocs de notas, etc…

Implementación

Para que la aplicación desarrollada que nuestra aplicación tenga esta funcionalidad, debe incluir el contrato Picker, que se agrega en la ventana Project > Add New Item… :
Una vez agregado, es necesario configurar, como se ha visto en el artículo dedicado al contrato Share, la opción Supported File Types en el fichero .appxmanifest. Esta opción permitirá limitar a qué tipo de ficheros accederán las otras aplicaciones.


Una vez hecho esto, se habrá creado una plantilla similar a la de compartir. La diferencia es que todo el manejo de ficheros y la interfaz tendrá que ir por nuestra cuenta, mientras respetemos los elementos comunes de la interfaz.

El objeto más importante para poder proporcionar ficheros es el objeto FilePickerBasket, que servirá como enlace común.al resto de las aplicaciones.

Para poder agregar ficheros al Basket se usará un código similar en el caso de que la ruta al fichero sea local:

StorageFile pickedFile = await Package.Current.InstalledLocation.GetFileAsync(@"ruta\al\fichero");
this.AddFileToBasket("Fichero local", pickedFile);

En el caso de que el fichero se encuentre en un servidor remoto, será necesario que el servicio asociado proporcione una URL para poder acceder a él, y el propio sistema se encargará de descargarlo y asociarlo a la aplicación que lo requiera.

StorageFile pickedUriFile = await StorageFile.GetFileFromUriAsync(uri, filename, StreamReference.CreateFromUri("http://ruta/al/fichero"));
this.AddFileToBasket("Fichero remoto", pickedUriFile);

La última línea cargará el siguiente código auxiliar, válido tanto para ficheros locales como remotos.

        void AddFileToBasket(string id, StorageFile file)
        {
            bool inBasket;
            switch (this.basket.AddFile(id, file))
            {
                case AddFileToBasketResult.AddedToBasket:
                case AddFileToBasketResult.AlreadyInBasket:
                    inBasket = true;
                    break;

                default:
                    inBasket = false;
                    break;
            }
            this.UpdateSelectionState(id, inBasket);
        }

Para eliminar un fichero del Basket el código sería este, válido tanto para un fichero local como para un fichero remoto:

id = "Nombre del fichero";
if (this.basket.ContainsFile(id))
{
    this.basket.RemoveFile(id);
}

Conclusiones

Las nuevas maneras de consumir y proporcionar ficheros de las aplicaciones Metro permite, al igual que como se veía en los artículos dedicados a las opciones de compartir, llegar a un nuevo nivel de interacción entre diferentes aplicaciones y con el propio sistema.

Serán los propios usuarios, quienes descubran nuevas maneras de combinar las aplicaciones existentes usando estos nuevos servicios, creando una nueva experiencia en el uso de sus ordenadores personales.

Más información

Consumir ficheros en aplicaciones Metro

En artículos anteriores se ha visto cómo compartir contenido desde nuestras aplicaciones así como consumir contenido de otras. En este artículo y en el siguiente se hablará de cómo consumir ficheros del sistema de archivos, y como proporcionar opciones para que otras aplicaciones puedan hacerlo usando el contrato File Picker.

Consumiendo ficheros

Para poder consumir ficheros solamente es necesario cargar un menú, de la misma manera que lo haríamos con una aplicación Windows Forms.

Lo primero necesario es una referencia a Windows.Storage.Pickers así como a Windows.Storage

Tras agregar la referencia, el siguiente paso es cargar el filePicker, para ello, se puede asignar a un botón, enlazandolo con el evento Click, o también se podría cargar automáticamente (por ejemplo, si estuviese vacía una base de datos, para una importación inicial). Estos métodos, como se ha visto en otros artículos relacionados con Metro, deberán ser asíncronos.

Finalmente se podrán establecer filtros para seleccionar una extensión concreta, la manera de mostrar el menú de selección, o si lo que se carga es una selección simple o una múltiple.

De esta manera para seleccionar un único fichero txt situado en la biblioteca Documents, y que se muestre como una lista de ficheros, el código a usar será este:

async void Button_Click(object sender, RoutedEventArgs e)
{
    FileOpenPicker openPicker = new FileOpenPicker();
    openPicker.ViewMode = PickerViewMode.List;
    openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
    openPicker.FileTypeFilter.Add(".txt");
    StorageFile file = await openPicker.PickSingleFileAsync();
}

Como alternativas a este código, si el objetivo es cargar múltiples ficheros, se ha de cambiar la última llamada del código por pickMultipleFilesAsync(). En caso de que el contenido sean imágenes, lo más recomendable sería cambiar la cuarta línea del código para que se mostraran como miniaturas, para lo que se usaría PickerViewMode.Thumbnail.

En el próximo artículo se mostrará cómo se pueden proporcionar ficheros a otras aplicaciones y al sistema como si de otro origen de datos se tratara.

Más información