Clique e receba as novidades quentinhas no Telegram

storage-api-windows-phone-8

Olá pessoal, tudo bom?

Para quem já trabalha com desenvolvimento de APPs para Windows Phone desde a versão 7, sabe que para se manipular arquivos temos a classe IsolatedStoreFile, no entanto, para facilitar um pouco mais a vida do desenvolvedor, a Microsoft disponibilizou um novo conjunto de recursos para manipulação de arquivos no Windows Phone 8 denominada Storage API (StorageFile e StorageFolder).

Para demonstrar o uso desse novo recurso, resolvi criar um exemplo baseado no post IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto, mas agora aplicando as novas classes do Windows Phone 8, sendo que o objetivo do exemplo é demonstrar a criação de um arquivo (notes.txt) dentro de uma pasta chamada (myNotes) e no arquivo gravar anotações que o usuário faça em um editor de textos fictício. Vejamos:

1º passo: Acessando a APP

Logo ao acessar a APP crio a pasta myNotes no LocalFolder da aplicação. Lembrando que esse diretório servirá para armazenar o arquivo notes.txt do usuário.

...
public Notepad()
{
  InitializeComponent();

  LerDados();
}

public async void LerDados()
{
  //Método para criar a pasta que irá armazenar o arquivo de anotações
  CriarPasta("myNotes");

  //Após criar a pasta, precisamos da referência da mesma para ler o arquivo dentro dela
  StorageFolder folder = await ApplicationData.Current.LocalFolder.GetFolderAsync("myNotes");
  try
  {
    //Obtém a referência ao arquivo de anotações dentro da pasta myNotes
    StorageFile file = await folder.GetFileAsync("notes.txt");
    //Abre o arquivo para leitura, pega seu conteúdo e "joga" no textbox da APP
    IRandomAccessStream randomAccessStream = await file.OpenAsync(FileAccessMode.Read);
    using (DataReader reader = new DataReader(randomAccessStream.GetInputStreamAt(0)))
    {
      uint bytes = await reader.LoadAsync((uint)randomAccessStream.Size);
      string texto = reader.ReadString(bytes);
      txtTexto.Text = texto;
    }
    randomAccessStream.Dispose();
  }
  catch { }
}

private async void CriarPasta(string nomePasta)
{
  StorageFolder folder;
  try
  {
    //Verificar a existencia da pasta. Caso não encontre o fluxo é direcionado para o catch
    folder = await ApplicationData.Current.LocalFolder.GetFolderAsync(nomePasta);
  }
  catch (FileNotFoundException ex)
  {
    folder = null;
  }
  if (folder == null)
    //Cria a pasta dentro da organização de arquivos da APP
    await ApplicationData.Current.LocalFolder.CreateFolderAsync(nomePasta);
}

2º passo: Gravando as anotações

Quanto o usuário seleciona o botão Gravar da APP o seguinte método é executado:

private async void btnGravar_Click(object sender, RoutedEventArgs e)
{
  //Obtém referência à pasta myNotes para posteriormente criar o arquivo dentro dela
  StorageFolder folder = await ApplicationData.Current.LocalFolder.GetFolderAsync("myNotes");

  //Criando o arquivo dentro da pasta
  StorageFile file = await folder.CreateFileAsync("notes.txt", CreationCollisionOption.ReplaceExisting);
  //Abrindo o arquivo para Leitura e Escrita para "jogar" o conteúdo desejado dentro dele
  IRandomAccessStream randomAccessStream = await file.OpenAsync(FileAccessMode.ReadWrite);
  using (DataWriter writer = new DataWriter(randomAccessStream.GetOutputStreamAt(0)))
  {
    writer.WriteString(txtTexto.Text);
    await writer.StoreAsync();
  }
}

3º passo: Excluindo as anotações

Caso o usuário selecione a opção Limpar anotações da APP, excluímos o arquivo que armazena as notas.

private async void btnLimpar_Click(object sender, RoutedEventArgs e)
{
  if (MessageBox.Show("Limpar anotações?", "Confirmação", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
  {
    //Obtém referência da pasta onde o arquivo está armazenado.
    StorageFolder folder = await ApplicationData.Current.LocalFolder.GetFolderAsync("myNotes");
    try
    {
      //Obtém referência do arquivo e depois tenta realizar a exclusão
      StorageFile file = await folder.GetFileAsync("notes.txt");
      await file.DeleteAsync();
      txtTexto.Text = string.Empty;
    }
    catch
    {
      MessageBox.Show("Você não possui anotações.", "Informação", MessageBoxButton.OK);
    }
  }
}

A imagem abaixo demonstra a organização de arquivos da APP através da ferramenta WP Power Tools.

wp-power-tools

Espero que tenham gostado. Grande abraço !

Eduardo Henrique Rizo (@eduardorizo)

Post Relacionado: 

Fonte: Blog do Eduardo H. Rizo