Abrir y guardar archivos en Windows 8 (Modern UI)

Para acceder a un archivo en Windows 8 en el modo Modern UI contamos con la clase FileOpenPicker cuya funcionalidad es parecida a un cuadro de dialogo para seleccionar un archivo, esta ventana nos permitirá navegar por nuestros documentos y seleccionar el que deseemos.

Como abrir una imagen


Lo primero que vamos a hacer es crear un proyecto básico. A la página principal le añadiremos un botón y un control Image al cual llamaremos img, creamos un controlador de eventos para el evento click del botón. 

Ahora modificaremos el código C# debemos agregar los namespace siguientes:

  • using Windows.Storage.Pickers; 
  • using Windows.UI.ViewManagement; 
  • using Windows.Storage.Streams; 
  • using Windows.Storage; 
  • using Windows.UI.Xaml.Media.Imaging; 
Luego de esto hacemos nuestro controlador de eventos asíncrono agregándole la palabra clave async, antes de abrir el cuadro de búsqueda debemos asegurarnos de la aplicación no esté en la vista snapped si lo está la cambiamos con el método TryUnsnap.

private async void AbrirImagen(object sender, RoutedEventArgs e)
 {
     if (ApplicationView.Value != ApplicationViewState.Snapped ||
         ApplicationView.TryUnsnap() == true)
     {

Lo siguiente que hacemos es crear el FileOpenPicker, establecer el directorio inicial de búsqueda estableciendo la propiedad SuggestedStartLocation, también cambiamos el modo de vista como se mostraran las imágenes estableciendo ViewMode, tenemos dos modos modo lista y modo miniaturas, también podemos especificar los tipos de imágenes que queremos abrir.

FileOpenPicker openPicker = new FileOpenPicker();

openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.ViewMode = PickerViewMode.Thumbnail;

openPicker.FileTypeFilter.Clear();
openPicker.FileTypeFilter.Add(".bmp");
openPicker.FileTypeFilter.Add(".png");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".jpg");

Una vez tenemos creado y configurado el FileOpenPicker tenemos que mostrarlo lo hacemos mediante el método PickSingleFileAsync, este método es asíncrono por lo que debemos agregar la palabra clave await, este método también nos devuelve un StorageFile que usaremos para acceder al archivo seleccionado.

StorageFile file = awaitopenPicker.PickSingleFileAsync();

Verificamos si nos han devuelto un file valido, abrimos el archivo, creamos la imagen y la asignamos a nuestro control Image.

if (file != null)
{
    //Acceder al archivo seleccionado
    IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);

    //crear una Imagen
    BitmapImage bitmapImage = new BitmapImage();

    //Establecer el origen de la imagen en el archivo que acabamos de abrir
    bitmapImage.SetSource(fileStream);

    //asignar la imagen creada a nuestro control Image
    img.Source = bitmapImage;
}


Como guardar un archivo


Para demostrar como guardar un archivo vamos a agregar un TextBox llamado txt para escribir algún texto y un botón guardar para crear un archivo de texto plano y guardarlo.


Para guardar un archivo usaremos FileSavePicker el modo de usarlo es parecido a la clase anterior con la diferencia de que podemos especificar los posibles tipos de archivos que podemos almacenar y un nombre por defecto para el archivo, entre otros.

FileSavePicker savePicker = new FileSavePicker();

savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
savePicker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" });
savePicker.SuggestedFileName = "New Document";

Para mostrar el FileSavePicker usamos el método PickSaveFileAsync, este método también devuelve un StorageFile que esta vez usaremos para escribir un archivo.

StorageFile file = await savePicker.PickSaveFileAsync();

Debemos agregar el namespace using Windows.Storage.Provider;

La clase CachedFileManager nos permite actualizar archivos y evitar que sean actualizados por otras aplicaciones, debemos llamar el método DeferUpdates para evitar que el archivo sea actualizado y llamar al método CompleteUpdateAsync para que el archivo sea actualizado.

if (file != null)
{
    CachedFileManager.DeferUpdates(file);

    //excribir el contenido de txt en el arhivo
    await FileIO.WriteTextAsync(file, txt.Text);

    FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(file);
}

Descargar Código de Ejemplo

Comentarios

  1. Disculpa, si quiero escribir linea por linea y no que caiga todo el texto de una vez que propiedad debo utilizar?

    ResponderEliminar
    Respuestas
    1. Para escribir lineas de texto puedes usar la función WriteLinesAsync de la clase FileIO, como segundo parámetro debes indicar una lista de string con las lineas que deseas colocar.

      Eliminar

Publicar un comentario

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Procesamiento de imágenes en OpenCV

Acceso a la webcam con OpenCV

Conociendo la clase cv::Mat de OpenCV