Curso Windows Phone – Manipulando arquivos texto no Windows Phone 8

storage-api-windows-phone-8Olá 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

Post Relacionado: 

[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]

13 comentários em “Curso Windows Phone – Manipulando arquivos texto no Windows Phone 8”

  1. Pingback: Free: Curso Windows Phone – Vários tópicos | Blog do Eduardo H. Rizo

  2. Pingback: Curso Windows Phone – IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto – Windows Phone 7 | Blog do Eduardo H. Rizo

  3. Olá professor, quando é criado este arquivo TXT, ele não fica disponível ou eu não achei o arquivo .TXT nas pastas do windows phone quando conecto o cabo, é possível criar um arquivo que fique disponível quando conectar o cabo para que possa copia-lo?

      1. Então, com este programa deu certo, queria gerar um .TXT para que os usuários da minha app tenham acesso quando conecta o cabo usb ou algo assim..

      2. É por aí, visto que cada APP tem seu próprio “sistema de arquivos”, ou seja, você precisa de alguma forma disponibilizar o acesso por outros meios.

        Abraços,
        Eduardo

  4. Olá professor, não sei se vc vai ter algum exemplo de upload e download de um arquivo txt via skydrive (onedrive), consegui fazer upload, mais download não estou conseguindo. Se tiver alguma idéia agradeço…abraço.

  5. Olá Eduardo…
    Gostaria de saber se esse exemplo funcionaria se eu o fizesse da mesma forma no visual studio 2012 na criação de um APP para windows 8.

    Todos os exemplos para windows phone que temos aqui no seu site funcionam na criação de um APP para win 8?

    Obg

  6. Olá, me ajudou muito pq até então não conseguia fazer essa manipulação. Só que estou com a seguinte dificuldade: Minha aplicação pega uma foto selecionada pelo usuário e renomeia jogando numa pasta padrao da minnha aplicacao, só que dependendo da imagem ela vem num formato muito grande o que pode ocupar muito espaco, teria uma forma de antes de copiar a foto selecionada eu definir um tamanho menor? eu to pegando um aruqivo bitmapimage, renomeio pra o nome que quero e jogo na pasta padrao q criei, mas como falei ela é copiada do mesmo tamanho, preciso dela menor. (windows phone 8.1)

    Grato pela ajuda do artigo.

Deixe um comentário