Silverlight - Acesso a arquivos
Neste capítulo, veremos como os aplicativos Silverlight podem acessar arquivos no computador do usuário final. Existem três maneiras principais de acessar arquivos no Silverlight. A escolha dependerá do motivo pelo qual você precisa usar os arquivos e se você está escrevendo um aplicativo confiável.
A opção mais flexível é usar o file dialogAulas. Com oOpen e Savecaixas de diálogo de arquivo, você pode obter acesso a qualquer arquivo que o usuário final escolher, desde que o usuário tenha as permissões apropriadas. O consentimento do usuário é fundamental para essa abordagem. O usuário deve escolher qual arquivo ler ou, ao salvar, escolher um arquivo para sobrescrever ou escolher um local e um nome de arquivo para você.
A segunda opção é usar as várias classes do System.IOnamespace. Silverlight oferece aulas comoFileStream, StreamWriter, FileInfo, Directory, e DirectoryInfo, tudo o que torna possível escrever código que abre e acessa arquivos sem a necessidade de envolver o usuário. Isso pode ser mais conveniente para o desenvolvedor, mas é claro, a maioria dos usuários não gostaria que nenhum código antigo baixado como parte de uma página da web pudesse pesquisar em seus arquivos.
A terceira opção é Isolated Storage, que discutiremos mais tarde.
Abrir e salvar caixas de diálogo de arquivo
SaveFileDialog
o SaveFileDialog A classe mostra a interface de usuário padrão fornecida pelo sistema operacional para escolher onde salvar um arquivo.
Alguns recursos importantes são -
Para usá-lo, criamos uma instância do SaveFileDialog classe.
Chamando ShowDialog, faz com que ele apareça e o código de retorno nos informa se o usuário selecionou um local para salvar o arquivo ou cancelou a caixa de diálogo.
Você pode estar se perguntando sobre a comparação de aparência redundante com Truehá. E seShowDialog retorna Truevalor, o que significa que o usuário selecionou um arquivo. Então podemos continuar a ligar para oOpenFile método, que nos retorna um Stream.
Se quisermos, podemos descobrir o nome que o usuário escolheu. A caixa de diálogo fornece uma propriedade chamadaSafeFileName, mas isso não inclui o caminho. Em qualquer caso, a única maneira de escrever dados é usar oStreamretornado pelo diálogo. Do ponto de vista do desenvolvedor, este é apenas um.NET stream, para que possamos envolvê-lo em um StreamWriter, para escrever um texto nele.
OpenFileDialog
O OpenFileDialog é semelhante em uso ao SaveFileDialog. Obviamente, você está sempre escolhendo um arquivo existente em vez de um novo, mas há outra diferença importante.
Ele oferece uma propriedade chamada MultiSelect. Se você definir isso paraTrue, o usuário pode escolher vários arquivos. Isso significa que a caixa de diálogo precisa de uma API um pouco mais complexa.
o SaveFileDialog lida apenas com um arquivo por vez, mas OpenFileDialog é capaz de lidar com mais, por isso não oferece um OpenFilemétodo. Precisamos expandir o código. Dependendo se a caixa de diálogo está emsingle file modo, ou MultiSelect modo, você usa o seu File, ou Files propriedade.
Aqui, no exemplo dado abaixo, estamos no modo de arquivo único. Portanto, usamosFile, e nós ligamos OpenRead no FileInfo objeto que retorna.
Dentro multiselect modo, nós usaríamos Files em vez disso, o que retorna uma coleção de FileInfo objetos.
FileStream
A segunda abordagem para file access como mencionado acima é usar o FileStream classe, ou tipos relacionados na System.IOnamespace diretamente. Não há muito a dizer sobre isso, porque na maior parte, é semelhante ao acesso ao arquivo com o total.NET Framework.
No entanto, existem algumas reviravoltas específicas do Silverlight.
Em primeiro lugar, essa abordagem permite que você acesse os arquivos a qualquer momento sem a intervenção do usuário e sem qualquer indicação visível óbvia de atividade do arquivo, apenas aplicativos confiáveis têm permissão para usar essa técnica. Lembre-se de que você precisa ficar sem navegador para obter confiança elevada.
O segundo problema é que apenas os arquivos em certas pastas específicas estão disponíveis. Você só pode ler e gravar arquivos que estão sob oUser's Documents, Music, Pictures, or Video files. Uma razão para isso é que o Silverlight é executado em várias plataformas, e a estrutura do sistema de arquivos para, digamos, um Apple Mac, é muito diferente daquela do Windows. Portanto, o acesso a arquivos de plataforma cruzada deve funcionar em termos de um conjunto limitado de pastas que estão disponíveis em todos os sistemas compatíveis com o Silverlight.
Uma vez que essas pastas estarão em locais diferentes em sistemas operacionais diferentes, e sua localização normalmente varia de um usuário para outro, você precisa usar o Environment.GetFolderPath método para descobrir a localização real em tempo de execução.
Você pode inspecionar a estrutura do diretório abaixo dos pontos de partida. oDirectory e DirectoryInfo aulas no System.IO namespace permite enumerar arquivos e diretórios.
Considere um exemplo simples em que o arquivo pode ser aberto via OpenFileDialog e salve algum texto no arquivo via SaveFileDialog.
A seguir está o código XAML em que dois botões e um text box são criados.
<UserControl x:Class = "FileDialogs.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition Height = "265*" />
</Grid.RowDefinitions>
<Button
x:Name = "saveFileButton"
Content = "Save"
Width = "75" FontSize = "20"
HorizontalAlignment = "Left" VerticalAlignment = "Top"
Margin = "12,12" Click = "saveFileButton_Click" />
<Button
x:Name = "openFileButton"
Content = "Open"
Width = "75" FontSize = "20"
HorizontalAlignment = "Left" VerticalAlignment = "Top"
Margin = "101,12,0,0" Click = "openFileButton_Click" />
<TextBox
x:Name = "contentTextBox"
Grid.Row = "1"
Margin = "12" FontSize = "20" />
</Grid>
</UserControl>
A seguir, é fornecido o código C # para implementação de eventos de clique em que o arquivo é aberto e salvo.
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
namespace FileDialogs {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void saveFileButton_Click(object sender, RoutedEventArgs e) {
var save = new SaveFileDialog();
save.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
save.DefaultExt = ".txt";
if (save.ShowDialog() == true) {
Debug.WriteLine(save.SafeFileName);
using (Stream saveStream = save.OpenFile())
using (var w = new StreamWriter(saveStream)) {
var fs = saveStream as FileStream;
if (fs != null) {
w.Write(contentTextBox.Text);
}
}
}
}
private void openFileButton_Click(object sender, RoutedEventArgs e) {
var open = new OpenFileDialog();
if (open.ShowDialog() == true) {
using (Stream openStream = open.File.OpenRead()) {
using (var read = new StreamReader(openStream)) {
contentTextBox.Text = read.ReadToEnd();
}
}
}
}
}
}
Quando o código acima for compilado e executado, você verá a seguinte página da Web, que contém dois botões.
Clique no Open botão, que irá abrir OpenFileDialog para selecionar um arquivo de texto.
Selecione um arquivo de texto e clique em Open, você verá o texto na caixa de texto.
Para salvar o texto no arquivo, atualize o texto.
Clique no Save botão para salvar as alterações em um novo arquivo de texto ou arquivo existente.
Para salvar as alterações no arquivo de texto existente, selecione o arquivo de texto em SaveFileDialog, mas se você quiser salvar as alterações no novo arquivo, escreva o nome do arquivo e clique no botão Save botão.