Curso Windows Phone – IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto – Windows Phone 7

Olá pessoal, tudo bom?

Venho por meio deste post passar mais uma dica rápida para quem está descobrindo recursos e técnicas de programação para o Windows Phone, sendo que dessa vez o tema é sobre a classe IsolatedStorageFile que pertence ao namespace System.IO.IsolatedStorage e permite ao desenvolvedor, dentre muitas outras coisas, armazenar dados da aplicação em arquivos texto.

O exemplo colocado aqui é uma aplicação simples que permite ao usuário armazenar anotações em uma espécie de bloco de notas, sendo que quando a aplicação é carregada, fazemos uma leitura do arquivo existente e colocamos o conteúdo do mesmo em um TextBox. A aplicação permite ao usuário alterar suas anotações e depois regravar o texto sobre o arquivo já existente, dessa forma o aplicativo sempre mantem a última atualização feita pelo usuário.

Veja abaixo o programa escrito em C#:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO.IsolatedStorage;
using System.IO;

namespace EspecializacaoWP7
{
   public partial class Notepad : PhoneApplicationPage
   {
      public Notepad()
      {
         InitializeComponent();

         IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();
         try
         {
            StreamReader stream = new StreamReader(new IsolatedStorageFileStream("notepad.txt", FileMode.Open,iso));
            txtAnotacoes.Text = stream.ReadToEnd();
            stream.Close();
         }
         catch (Exception)
         { }
      }

      private void btnGravar_Click(object sender, RoutedEventArgs e)
      {
         IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication();
         IsolatedStorageFileStream file = new IsolatedStorageFileStream("notepad.txt", System.IO.FileMode.Append, iso);

         StreamWriter stream = new StreamWriter(file);
         stream.Write(txtAnotacoes.Text);
         stream.Close();
      }
   }
}

diskette Download do exemplo deste post

É isso aí. Um grande abraço a todos,

Eduardo Henrique Rizo

Posts relacionados:

Curso Windows Phone – Tópicos

Curso Windows Phone – Como ler arquivos texto armazenados localmente na estrutura de diretórios da APP

Manipulando arquivos texto no Windows Phone 8

Coordenador de Internet da Universidade do Oeste Paulista (Unoeste) e professor universitário de disciplinas relacionadas ao desenvolvimento de sistemas para Web, gerenciamento de servidores, serviços e redes.

Marcado com: , , ,
Publicado em Windows Phone
55 comentários em “Curso Windows Phone – IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto – Windows Phone 7
  1. […] Windows Phone – IsolatedStorageFile […]

  2. Raunni Ferrari Martines disse:

    onde fica armazenado este arquivo notepad.txt ? é possivel gravar ele no aparelho e depois abrir em algum aplicativo ?

    • Tudo bom Raunni?
      O arquivo fica na área do aparelho reservada para cada aplicação, por isso o nome IsolatedStorageFile. É possível você enviar o conteúdo do arquivo por e-mail ou mesmo acessá-lo via algum gerenciador de arquivos já disponíveis para o WP7.

  3. Renan disse:

    Boa tarde.
    Você sabe me dizer como que eu pego o caminho aonde a aplicação fica instalada ?
    Tipo Ex :
    C://Programas/Teste/

    Existe algum método deste tipo ?

  4. Andre Nunes disse:

    Estou criando um jogo de RPG e gravo os status em arquivo txt com a classe “IsolatedStorageFile”, mas vou implementar um ranking online e não gostaria que qualquer usuário com o Bazzar pudesse modificar os parâmetros e “subir” no ranking online. Existe alguma outra classe que grave valores já criptografados ou em algum lugar mais seguro? Ou eu mesmo precisarei criar uma solução de criptografia? A classe “IsolatedStorageSettings” protege melhor estas informações?
    Obrigado!

    • Bom dia André, tudo bom?
      Pensei em duas coisas, mas antes de responder, deixe eu entender melhor como funcionaria o teu ranking on-line. Provavelmente você hospedar isso em algum servidor, certo? Se sim, trará os dados do ranking para o WP via WebServices ou WCF, certo?
      Se for desse forma, você poderia desenvolver um WebMethod (WebServices) para receber a pontuação do jogador que estiver on-line. Isso não daria certo?

      []s
      Eduardo

      • Andre Nunes disse:

        O ranking online é formado somente com a soma dos valores das habilidades do personagem (ataque, defesa, magias, etc. Atualmente são 8 habilidades).
        Se o jogo fosse online eu poderia gravar tudo fora do celular e ler sempre ao iniciar um novo jogo, porem a ideia inicial é de um jogo offline com o recurso de ranking online sendo um “plus “, então esta ideia não daria certo… 😦

      • Certo, mas em qual momento os dados do ranking offline seria transferido para o ranking online?
        Não sei se estou entendendo corretamente?!

  5. Andre Nunes disse:

    O jogo é dividido em ciclos de tempo (como em infinity blade, para iPhone) que, no fundo, são as fases de um jogo tradicional. No final de cada ciclo/fase eu baixo o ranking e verifico se a soma dos valores de sua habilidade está entre as 10 maiores. Se sim, atualizo seu nome lá, se não, nao faço nada. Independente de voce entrar no ranking ou nao seus valores ficarão salvos no celular em txt para que, ao iniciar uma nova fase, suas habilidades continuem no mesmo nível que estavam no final da fase anterior (independente de voce ter desligado ou nao o jogo). Meu problema é alguem abrir o arquivo txt e alterar os valores das habilidades para um valor maior e, no final da fase (SE ele estiver online), seu nome ficar em primeiro no ranking.

    • Entendi!

      Bem, eu penso em duas possibilidades:
      1) Toda vez que você gravar o arquivo texto, você grava uma outra informação com o hash (md5 por exemplo) do arquivo que você acabou de gravar, sendo assim, toda vez que você abrir o aplicativo, você faz um outro hash do arquivo que está no telefone e compara o resultado com o último hash que você gravou, assim poderá confirmar se os dados estão da forma como a sua aplicação havia gravado antes. Esse informação do hash poderia ficar no IsolatedStorageSettings.
      2) Gravando os dados que precisa em um banco de dados local da aplicação, você minimiza a chance de alguém conseguir alterar alguma coisa.

      Particularmente, eu ficaria com a primeira opção.

      Grande abraço,
      Eduardo

  6. Andre Nunes disse:

    Bom, o hash nao foge muito a ideia da criptografia. Vou ver a melhor (o mais simples) forma de implementar.

    Obrigado, Eduardo!

  7. Josias Valiengo disse:

    Oi Eduardo,
    O caso acima é para arquivos .txt, mais eu gostaria de criar um arquivo .xml, e ficar add linhas a esse arquivo.
    tem como?

  8. Josias Valiengo disse:

    oi Eduardo,
    eu pegaria os dados de um webservice e add no arquivo .xml

  9. Davide Santos disse:

    Boas,

    Sou novato nestas cenas mas tentei fazer o teu totorial no SDK e não deu certto usei o WP OS 7.1. Será disso?
    Como se faz este mesmo programa para está versão

    • Olá Davide, tudo bom?
      Esse post foi feito baseado em uma APP para o WP que o utiliza o SDK 7.1, ou seja, o mesmo que você tentou trabalhar.
      Você poderia especificar melhor o problema que teve para que eu possa lhe ajudar?

      []s
      Eduardo

      • Davide Santos disse:

        Ao carregar no guardar ele não guarda nada no ficheiro TXT nem consegue ler.

      • Davide é estranho, pq já validei o código do exemplo e está tudo OK. Deve haver algum outro bug no teu programa que está gerando essa situação.
        Já experimentou fazer o debug?

        []s
        Eduardo

      • Davide Santos disse:

        Corri o debug e diz “Error 1 A interface é desconhecida.”. Na linha 0 é necessário instalar alguma coisa para além do SDK?

      • Não, nada além do SDK… ;-(

      • Davide Santos disse:

        voltei agora a correr e não deu erro nenhum nas propriedades da text box temos que alterar alguma coisa?

  10. Davide Santos disse:

    Não tens o sitio onde possa fazer download do teu programa para ver melhor?

    • Davide, repare que agora disponibilizei no final do post o download do exemplo.

      Grande abraço,
      Eduardo

      • Davide Santos disse:

        O Meu problema está em ler um ficheiro *.TXT que já exista e consegui-lo alterar o conteúdo o código é o mesmo ou é diferente?
        É que este não está a fazer isso.

      • Davide tudo bom?
        Na instrução IsolatedStorageFileStream file = new IsolatedStorageFileStream(“notepad.txt”, System.IO.FileMode.Create, iso); que está no clique no do botão Gravar, troque para:
        IsolatedStorageFileStream file = new IsolatedStorageFileStream(“notepad.txt”, System.IO.FileMode.Append, iso);

        []s
        Eduardo

  11. Davide Santos disse:

    Não devia ficar o nosso texto no ficheiro? e quando se abre o programa na txtTexto não devia aparecer o que está escrito no ficheiro??

    • Sim, a ideia é essa.
      Não está acontecendo assim?

      • Davide Santos disse:

        Se eu adicionar um ficheiro de texto na programação e escrever lá qualquer coisa e o mandar abrir não aparece esse texto na textbox.

      • Boa noite Davide, tudo bom?
        Você chegou a fazer o download do exemplo e observar/debugar o código?
        Acabei de conferir novamente o programa e está tudo OK.

        Lembro que enquanto você estiver desenvolvendo o programa o arquivo será mantido até que o emular se mantenha aberto. Caso você venha fechar o emulador e executar o programa novamente, o arquivo será perdido pois é como se você tivesse desinstalado o programa do telefone. Entendeu?

        []s
        Eduardo

  12. […] Post relacionado: Curso Windows Phone – IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto […]

  13. […] Post relacionado: Curso Windows Phone – IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto […]

  14. […] 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 é […]

  15. […] 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 é […]

  16. Ulisses disse:

    Olá professor!

    Estou criando um app em C# que armazena o total de toques que o usuário tenha realizado em um botão na tela. O Isolated Storage até grava o total de toques, o único problema é que quando inicio novamente o app, o sistema começa a contar do número 1.

    Acredito que quando inicio novamente o app, a variável volta para o valor padrão ao invés de permanecer com o ultimo número de antes.

  17. Ulisses disse:

    Olá professor! Como vai?

    O erro ocorre da mesma maneira. Quero tentar fazer um sistema que armazene as informações do usuário, por exemplo, o total de toques em um botão, porém após 100 toques gravados no sistema, automaticamente todo o conteúdo é apagado.

    Obrigado novamente

  18. Ulisses disse:

    Boa tarde professor!

    Como me solicitou abaixo está os códigos. Obrigado!

    namespace PhoneApp4
    {
    public partial class MainPage : PhoneApplicationPage
    {
    // Constructor
    public MainPage()
    {
    InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
    //Contador
    int x;
    x = Convert.ToInt16(Texto.Text);
    x += 1;
    Texto.Text = Convert.ToString(x);

    //Grava o valor do Texto.Text.
    IsolatedStorageSettings iso = IsolatedStorageSettings.ApplicationSettings;

    if (!iso.Contains(“chave”))
    {
    iso.Add(“chave”, Texto.Text);
    }
    else
    {
    iso[“chave”] = Texto.Text;
    }

    iso.Save();
    }

    //Apaga o conteúdo do Isolated Storage.
    private void Apagar_Click(object sender, RoutedEventArgs e)
    {
    if (IsolatedStorageSettings.ApplicationSettings.Contains(“chave”))
    {
    IsolatedStorageSettings.ApplicationSettings.Remove(“chave”);
    }
    }

    }
    }

    • Ulisses, não sei se entendi errado, mas no meu modo de análise, acho que você deveria antes de incrementar o contador, pegar o valor que já estava guardado no IsolatedStorageSettings e fazer com que ele fosse o valor inicial do mesmo, não é?

      Abraços,
      Eduardo H. Rizo

  19. Ulisses disse:

    Olá professor!

    Realmente não consigo, já tentei de várias formas, mas não da certo.

    Me de um exemplo, por favor.

    Obrigado!

    • Ulisses, boa noite!
      Eu acho que o clique do botão deveria estar implementado conforme consta abaixo:

      private void Button_Click(object sender, RoutedEventArgs e)
      {
      int x = 0;
      //Recuperar o valor que já está armazenado
      IsolatedStorageSettings iso = IsolatedStorageSettings.ApplicationSettings;
      iso.TryGetValue<int>(“chave”, out x);

      if (x == 0) //Se não conseguiu recuperar
      {
      x = Convert.ToInt16(Texto.Text);
      }

      x += 1;
      Texto.Text = Convert.ToString(x);

      if (!iso.Contains(“chave”))
      {
      iso.Add(“chave”, Texto.Text);
      }
      else
      {
      iso[“chave”] = Texto.Text;
      }

      iso.Save();
      }

      Abraços,
      Eduardo H. Rizo

  20. Ulisses disse:

    Olá professor!

    Está dando erro no iso.TryGetValue(“chave”, out x);

    Obrigado!

  21. Ulisses disse:

    Olá professor! Como vai?

    O senhor colocou o mesmo código.

    Abraços!

  22. Ulisses disse:

    Boa tarde professor!

    Me desculpe, mas não funciona.
    Ocorre erro no mesmo local.

    Não consigo fazer com que o contador seja armazenado e reutilizado posteriormente.

  23. ola eduardo
    estou fazendo um app que usa um texto muito grande pra ser lido pelo usuario, mas não consigo algum jeito de mostrar esse texto, pelo textblock não da a opçao de copiar, teria como eu escrever um texto em um bloco de notas e mostrar ele dentro de um textbox ?

    • Olá Vinícius, tudo bom?
      Basta fazer assim:

      <ScrollViewer>
      <TextBox Name="txtTexto" AcceptsReturn="True" IsReadOnly="True">SEU TEXTO AQUI...</TextBox>
      </ScrollViewer>

      Desse modo o sujeito terá um scroll para visualizar todo o conteúdo do TextBox e ainda não poderá alterar o texto.

      Abraços,
      Eduardo H. Rizo

Deixe um comentário

Sorocaba e Região
Prestadora de serviços RIZZO GS - Sorocaba/SP

Serviços de limpeza, conservação, recepção, copa, portaria, vigia, zeladoria, jardim, elétrica, hidráulica, pintura, etc.

Contato: (15) 3357-4263 / (15) 3357-4502 - contato@rizzogs.com.br

Website: http://www.rizzogs.com.br