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.