[Desenvolvimento] Manipulando arquivos texto no Windows Phone 8

1

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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
...
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

Share.

About Author

Bacharel em Ciência da Computação pela FIPP/Unoeste, Pós-Graduado em Desenvolvimento de Sistemas Web, Segurança da Informação e Avaliação do Ensino e da Aprendizagem, Professor universitário e responsável pelo setor de desenvolvimento de sistemas web da Universidade do Oeste Paulista. MCP e MCPS pela Microsoft e nas horas vagas dedica um pouco do seu tempo escrevendo posts técnicos sobre desenvolvimento de sistemas web, windows phone, gerenciamento de servidores e outros assuntos para a comunidade.

  • Rui Moraes

    Amigo, desculpe a ignorancia, eu vejo as vezes algumas pessoas citarem o famoso sync.
    E vc criou um método
    public sync CriarPastas…

    Qual seria a função do “sync” nesse caso?