Silverlight - Accesso ai file

In questo capitolo vedremo come le applicazioni Silverlight possono accedere ai file sul computer dell'utente finale. Esistono tre modi principali per accedere ai file in Silverlight. La scelta dipenderà dal motivo per cui è necessario utilizzare i file e dal fatto che si stia scrivendo un'applicazione attendibile.

  • L'opzione più flessibile è usare il file dialogclassi. Con ilOpen e Savefinestre di dialogo dei file, è possibile accedere a qualsiasi file scelto dall'utente finale, purché l'utente disponga delle autorizzazioni appropriate. Il consenso dell'utente è fondamentale per questo approccio. L'utente deve scegliere quale file leggere o, durante il salvataggio, sceglie un file da sovrascrivere o seleziona una posizione e un nome file per te.

  • La seconda opzione è utilizzare le varie classi nel file System.IOspazio dei nomi. Silverlight offre corsi comeFileStream, StreamWriter, FileInfo, Directory, e DirectoryInfo, che rendono possibile scrivere codice che apre e accede ai file senza la necessità di coinvolgere l'utente. Ciò potrebbe essere più conveniente per lo sviluppatore, ma ovviamente la maggior parte degli utenti non vorrebbe che nessun vecchio codice scaricato come parte di una pagina web possa cercare nei propri file.

  • La terza opzione è Isolated Storage, di cui parleremo più avanti.

Finestre di dialogo Apri e salva file

SaveFileDialog

Il SaveFileDialog class mostra l'interfaccia utente fornita dal sistema operativo standard per scegliere dove salvare un file.

Alcune caratteristiche importanti sono:

  • Per usarlo, creiamo un'istanza di SaveFileDialog classe.

  • Chiamando ShowDialog, lo fa apparire e il codice di ritorno ci dice se l'utente ha selezionato una posizione in cui salvare il file o ha annullato la finestra di dialogo.

  • Ti starai chiedendo del confronto dall'aspetto ridondante con TrueLà. SeShowDialog ritorna Truevalore, il che significa che l'utente ha selezionato un file. Quindi possiamo continuare a chiamare ilOpenFile metodo, che ci restituisce un file Stream.

  • Se lo vogliamo, possiamo scoprire il nome scelto dall'utente. La finestra di dialogo fornisce una proprietà chiamataSafeFileName, ma questo non include il percorso. In ogni caso, l'unico modo per scrivere dati è utilizzare il fileStreamrestituito dalla finestra di dialogo. Dal punto di vista di uno sviluppatore, questo è solo un ordinario.NET stream, quindi possiamo racchiuderlo in un file StreamWriter, per scrivere del testo al suo interno.

OpenFileDialog

OpenFileDialog è simile in uso a SaveFileDialog. Ovviamente, scegli sempre un file esistente anziché uno nuovo, ma c'è un'altra importante differenza.

  • Offre una proprietà chiamata MultiSelect. Se lo imposti suTrue, l'utente può scegliere più file. Ciò significa che la finestra di dialogo richiede un'API leggermente più complessa.

  • Il SaveFileDialog si occupa solo di un file alla volta, ma OpenFileDialog è in grado di far fronte a più, quindi non offre un OpenFilemetodo. Dobbiamo espandere il codice. A seconda che la finestra di dialogo sia in formatosingle file modalità, o MultiSelect modalità, si utilizza sia la sua File, o Files proprietà.

  • Qui, nell'esempio riportato di seguito, siamo in modalità file singolo. Quindi, usiamoFilee chiamiamo OpenRead sul FileInfo oggetto che ritorna.

  • In multiselect modalità, useremmo Files invece, che restituisce una raccolta di FileInfo oggetti.

FileStream

Il secondo approccio a file access come accennato in precedenza è utilizzare il FileStream class o tipi correlati nel file System.IOdirettamente lo spazio dei nomi. Non c'è molto da dire su questo, perché per la maggior parte è simile all'accesso ai file con il file.NET Framework.

Tuttavia, ci sono un paio di colpi di scena specifici di Silverlight.

  • Innanzitutto, questo approccio consente di accedere ai file in qualsiasi momento senza l'intervento dell'utente e senza alcuna indicazione visibile evidente dell'attività dei file, solo le applicazioni attendibili possono utilizzare questa tecnica. Ricorda, devi esaurire il browser per ottenere una maggiore fiducia.

  • Il secondo problema è che sono disponibili solo i file in determinate cartelle specifiche. Puoi leggere e scrivere solo file che si trovano sotto l'estensioneUser's Documents, Music, Pictures, or Video files. Uno dei motivi è che Silverlight funziona su più piattaforme e la struttura del file system, ad esempio, per un Mac Apple, è molto diversa da quella di Windows. Pertanto, l'accesso ai file multipiattaforma deve funzionare in termini di un insieme limitato di cartelle disponibili su tutti i sistemi supportati da Silverlight.

  • Poiché queste cartelle si trovano in posizioni diverse su sistemi operativi diversi e la loro posizione varia in genere da un utente all'altro, è necessario utilizzare il Environment.GetFolderPath metodo per scoprire la posizione effettiva in fase di esecuzione.

  • È possibile esaminare la struttura delle directory sotto i punti di partenza. IlDirectory e DirectoryInfo classi in System.IO lo spazio dei nomi ti consente di enumerare file e directory.

Considera un semplice esempio in cui il file può essere aperto tramite OpenFileDialog e salva del testo nel file tramite SaveFileDialog.

Di seguito è riportato il codice XAML in cui due pulsanti e un file text box sono creati.

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

Di seguito è riportato il codice C # per l'implementazione degli eventi di clic in cui il file viene aperto e salvato.

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 il codice sopra è stato compilato ed eseguito, vedrai la seguente pagina web, che contiene due pulsanti.

Clicca il Open pulsante, che si aprirà OpenFileDialog per selezionare un file di testo.

Seleziona un file di testo e fai clic Open, vedrai il testo nella casella di testo.

Per salvare il testo nel file, aggiorna il testo.

Clicca il Save per salvare le modifiche al nuovo file di testo o al file esistente.

Per salvare le modifiche al file di testo esistente, selezionare il file di testo in SaveFileDialog, ma se desideri salvare le modifiche al nuovo file, scrivi il nome del file e fai clic su Save pulsante.