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(); } } }
Download do exemplo deste post
É isso aí. Um grande abraço a todos,
[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]
Pingback: Curso Windows Phone – Tópicos « Blog do Eduardo H. Rizo
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.
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 ?
Boa tarde, tudo bom?
No site http://wp-bazaar.com/bazaar/BazaarHome.aspx você consegue encontrar algumas APPs que te permitem acessar o sistema de arquivos do Windows Phone, porém o teu aparelho precisa ser desbloqueado para poder instalar as APPs que são disponibilizadas nesse site.
Abraços,
Eduardo
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
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?!
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
Bom, o hash nao foge muito a ideia da criptografia. Vou ver a melhor (o mais simples) forma de implementar.
Obrigado, Eduardo!
Tranquilo…
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?
Também é possível.
Como seria a estrutura do arquivo XML que você deseja montar?
a estrutura seria desta forma
1
josias
valiengo
essas informações viriam de um webservice
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.
Valeu Eduardo!!
oi Eduardo,
eu pegaria os dados de um webservice e add no arquivo .xml
Já respondi no comentário anterior.
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
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
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… ;-(
voltei agora a correr e não deu erro nenhum nas propriedades da text box temos que alterar alguma coisa?
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
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
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?
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
Pingback: [Desenvolvimento] IsolatedStorageFile: Armazenando dados da aplicação em arquivos texto - Windows Phone Brasil
Pingback: Curso Windows Phone – Como ler arquivos texto armazenados localmente na estrutura de diretórios da APP | Blog do Eduardo H. Rizo
Pingback: [Desenvolvimento] Como ler arquivos texto armazenados localmente na estrutura de diretórios da APP - Windows Phone Brasil
Pingback: Curso Windows Phone – Manipulando arquivos texto no Windows Phone 8 | Blog do Eduardo H. Rizo
Pingback: [Desenvolvimento] Manipulando arquivos texto no Windows Phone 8 - Windows Phone Brasil
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.
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
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
Boa noite!
Eu creio que haja algum errinho no teu código fonte.
Se quiser me mandar os fontes, dou uma olhada.
[]s
Eduardo H. Rizo
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
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:
Abraços,
Eduardo H. Rizo
Olá professor!
Está dando erro no iso.TryGetValue(“chave”, out x);
Obrigado!
Opa, bom dia!
Acabei digitando errado. O correto seria: iso.TryGetValue<int>(“chave”, out x);
Abraços,
Eduardo
Olá professor! Como vai?
O senhor colocou o mesmo código.
Abraços!
Puxa vida, agora corrigi!
iso.TryGetValue<int>(“chave”, out x);
Abraços,
Eduardo H. Rizo
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.
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