Datos locales en apps Windows Store (C#). Lectura y escritura de ficheros

Las aplicaciones Windows Store pueden, además de almacenar ficheros con clave valor o mediante serialización como hemos visto en otros artículos, trabajar directamente con ficheros en 3 carpetas que tenemos a nuestra disposición:

  • Local: Se almacena en un directorio local al cual solamente tiene acceso nuestra app.
  • Roaming: Se almacena de manera local, aunque esos contenidos se sincronizan entre los diferentes dispositivos que tengan nuestra cuenta live id. Si tenemos un juego, y queremos mantener el estado de la partida sincronizado, podremos usar esta carpeta.
  • Temp: Se almacena de manera temporal, y se pueden borrar cuando la app esté cerrada.

En este artículo veremos cómo acceder a los ficheros almacenados en estas carpetas, y como hacer operaciones de lectura y escritura en los mismos.

Acceso a la ubicación:

Para acceder a estos datos, el primer paso es agregar la referencia a Windows storage:

using Windows.Storage;

Una vez tenemos la referencia, tenemos que acceder a la carpeta que contiene nuestros ficheros, y al fichero en sí, aquí podemos especificar qué tipo de carga queremos hacer:

StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFile myFile = await localFolder.CreateFileAsync("myfile.txt",
CreationCollisionOption.OpenIfExists);

El enum CreationCollisionOption permite especificar qué pasa si el fichero existe, teniendo entonces los siguientes escenarios:

  • Si existe, abrir
  • Si existe, devolver error.
  • Si existe, sobreescribir.
  • Si existe, renombrar.

Lectura de ficheros:

Para leer el fichero, en caso de que estemos trabajando con ficheros de texto, es mediante el uso de la clase FileIO:

string content = await FileIO.ReadTextAsync(myFile);

En este ejemplo todo el texto se lee a una sola variable, aunque también se puede pedir que devuelva cada línea en un elemento de una lista, usando el método ReadLinesAsync.
En caso de que estemos trabajando con ficheros binarios, deberemos realizar la lectura usando streams. Recordemos que los streams debemos liberarlos con la operación dispose como se muestra:

IRandomAccessStream stream = await myFile.OpenReadAsync();
stream.Dispose();

Aunque también es posible emplear using para un recurso que se liberará al salir del bloque;

using (IRandomAccessStream stream = await myFile.OpenReadAsync()){}

Una vez que tenemos el stream, se puede convertir a lo que necesitemos, imagen, audio, vídeo o incluso texto.
Escritura en ficheros:
Por lo generla una app de Windows 8 solamente puede escribir donde el usuario le diga, o en las carpetas que hemos comentado anteriormente. En el caso de ficheros de texto la escritura se realiza de la siguiente manera:

await FileIO.WriteTextAsync(myFile, content);

En el caso de streams, por otra parte, tenemos que leer el fichero con permisos de escritura, y usar un datawriter para almacenar información en nuestro stream. En el ejemplo, usando un texto:

using (IRandomAccessStream stream = await myFile.OpenAsync(
FileAccessMode.ReadWrite))
{
    using (DataWriter dataWriter = new DataWriter(stream))
    {
        dataWriter.WriteString(/*Text*/);
        await dataWriter.StoreAsync();
    }
}

Conclusiones

Usando el almacenamiento local y roaming podemos almacenar y acceder a ficheros de manera local en nuestra aplicacion. Estos ficheros pueden ser, o bien binarios, o bien de texto plano.

2 pensamientos en “Datos locales en apps Windows Store (C#). Lectura y escritura de ficheros

  1. Alán

    Muy buen post, que bien me hubiera venido hace unos días…
    Añado que para escribir un archivo puedes hacerlo de la siguiente manera, bloqueando el fichero hasta que se termine la escritura para que ningún otro proceso pueda acceder a él.

    Stream stream;
    lock (stream = await storageFile.OpenStreamForWriteAsync())
    {
    using (stream)
    {
    byte[] content = Encoding.UTF8.GetBytes(“Texto”);
    stream.WriteAsync(content, 0, content.Length);
    }
    }

    Responder
  2. Hilario

    Una duda, Se puede lograr cargar una imagen a un control image parecido al OpenfileDialog si se puede ayuda gracias…

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s