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

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

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

55 comentários em “Curso Windows Phone – IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto – Windows Phone 7”

  1. Pingback: Curso Windows Phone – Tópicos « Blog do Eduardo H. Rizo

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

    1. 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. 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. 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!

    1. 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

      1. 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… 🙁

  5. 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.

    1. 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. 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?

      1. a estrutura seria desta forma

        1
        josias
        valiengo

        essas informações viriam de um webservice

      2. Josias, teu WebServices retorna uma string com os elementos do XML ou ele retorna uma lista de um determinado tipo de objeto?

        Se ele te retornar uma string com os elementos do XML, então provavelmente você deve estar colocando esse retorno dentro de um objeto da classe XElement e então você poderia utilizar o método Save dessa classe para poder criar seu arquivo .xml
        Veja um exemplo aqui: http://msdn.microsoft.com/en-us/library/bb360171.aspx

        Caso teu WebServices retorne uma lista de um determinado tipo de objeto, sugiro que você assista ao vídeo que há no seguinte post do meu Blog:
        Curso Windows Phone – Como consumir dados de webservices. Nesse segundo caso, você poderia criar o arquivo XML manualmente ou usar o Linq para fazer isso. Veja os próximos 3 links:
        http://broadcast.oreilly.com/2010/10/understanding-c-simple-linq-to.html
        http://www.dotnetcurry.com/ShowArticle.aspx?ID=564
        http://msdn.microsoft.com/en-us/library/bb387089.aspx

        Grande abraço e boa sorte.

  7. 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

    1. 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

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

      2. 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

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

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

      1. 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.

      2. 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

  8. 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??

      1. 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.

      2. 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

  9. Pingback: [Desenvolvimento] IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto - Windows Phone Brasil

  10. Pingback: Curso Windows Phone – Como ler arquivos texto armazenados localmente na estrutura de diretórios da APP | Blog do Eduardo H. Rizo

  11. Pingback: [Desenvolvimento] Como ler arquivos texto armazenados localmente na estrutura de diretórios da APP - Windows Phone Brasil

  12. Pingback: Curso Windows Phone – Manipulando arquivos texto no Windows Phone 8 | Blog do Eduardo H. Rizo

  13. Pingback: [Desenvolvimento] Manipulando arquivos texto no Windows Phone 8 - Windows Phone Brasil

  14. 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.

    1. Bom dia Ulisses, tudo bom?

      Se sua intensão é armazenar apenas uma informação, ou seja, a quantidade de toques, sugiro que você use o IsolatedStorageSettings e não o IsolatedStorageFiles.
      De qualquer maneira, creio que você deve estar cometendo algum erro em sua programação, visto que o fato de fechar a APP não faria “apagar” o conteúdo do arquivo. Tente fazer um debug para ver o que está ocorrendo.

      Aproveite para dar uma lida no post que fala sobre o IsolatedStorageSettings: http://www.eduardorizo.com.br/2012/03/28/curso-windows-phone-isolatedstoragesettings-armazenando-informacoes-de-contexto-configuracao-da-ap/

      Qualquer coisa, me avise.

      Abraços,
      Eduardo H. Rizo

  15. 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

  16. 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”);
    }
    }

    }
    }

    1. 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

  17. Olá professor!

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

    Me de um exemplo, por favor.

    Obrigado!

    1. 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

  18. 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.

  19. 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 ?

    1. 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 para Ulisses Cancelar resposta