Silverlight - Accès aux fichiers

Dans ce chapitre, nous verrons comment les applications Silverlight peuvent accéder aux fichiers sur l'ordinateur de l'utilisateur final. Il existe trois façons principales d'accéder aux fichiers dans Silverlight. Le choix dépendra de la raison pour laquelle vous devez utiliser des fichiers et du fait que vous écrivez ou non une application approuvée.

  • L'option la plus flexible consiste à utiliser le file dialogDes classes. Avec leOpen et Saveboîtes de dialogue de fichier, vous pouvez accéder à tout fichier choisi par l'utilisateur final, à condition que l'utilisateur dispose des autorisations appropriées. Le consentement de l'utilisateur est au cœur de cette approche. L'utilisateur doit choisir le fichier à lire, ou lors de l'enregistrement, il choisit un fichier à écraser ou choisit un emplacement et un nom de fichier pour vous.

  • La deuxième option consiste à utiliser les différentes classes du System.IOespace de noms. Silverlight propose des cours tels queFileStream, StreamWriter, FileInfo, Directory, et DirectoryInfo, qui permettent tous d'écrire du code qui ouvre et accède aux fichiers sans avoir besoin d'impliquer l'utilisateur. Cela peut être plus pratique pour le développeur, mais bien sûr, la plupart des utilisateurs ne voudraient pas qu'un ancien code téléchargé dans le cadre d'une page Web puisse rechercher dans leurs fichiers.

  • La troisième option est Isolated Storage, dont nous discuterons plus tard.

Boîtes de dialogue Ouvrir et enregistrer un fichier

SaveFileDialog

le SaveFileDialog classe affiche l'interface utilisateur standard fournie par le système d'exploitation pour choisir où enregistrer un fichier.

Certaines caractéristiques importantes sont -

  • Pour l'utiliser, nous créons une instance du SaveFileDialog classe.

  • Appel ShowDialog, le fait apparaître et le code de retour nous indique si l'utilisateur a sélectionné un emplacement pour enregistrer le fichier ou annulé la boîte de dialogue.

  • Vous vous interrogez peut-être sur la comparaison redondante avec TrueLà. SiShowDialog Retour Truevalue, ce qui signifie que l'utilisateur a sélectionné un fichier. Ainsi nous pouvons continuer à appeler leOpenFile méthode, qui nous renvoie un Stream.

  • Si nous le voulons, nous pouvons découvrir le nom choisi par l'utilisateur. La boîte de dialogue fournit une propriété appeléeSafeFileName, mais cela n'inclut pas le chemin. Dans tous les cas, la seule façon d'écrire des données est d'utiliser leStreamrenvoyé par la boîte de dialogue. Du point de vue d'un développeur, il s'agit simplement d'un.NET stream, afin que nous puissions l'envelopper dans un StreamWriter, pour y écrire du texte.

OpenFileDialog

OpenFileDialog est similaire à l'utilisation du SaveFileDialog. De toute évidence, vous choisissez toujours un fichier existant plutôt qu'un nouveau, mais il existe une autre différence importante.

  • Il propose une propriété appelée MultiSelect. Si vous définissez cela surTrue, l'utilisateur peut choisir plusieurs fichiers. Cela signifie que la boîte de dialogue a besoin d'une API légèrement plus complexe.

  • le SaveFileDialog ne traite qu'un seul fichier à la fois, mais OpenFileDialog est capable de faire face à plus, donc il n'offre pas de OpenFileméthode. Nous devons étendre le code. Selon que la boîte de dialogue est ensingle file mode, ou MultiSelect mode, vous utilisez soit son File, ou Files propriété.

  • Ici, dans l'exemple ci-dessous, nous sommes en mode fichier unique. Par conséquent, nous utilisonsFile, et nous appelons OpenRead sur le FileInfo objet qui retourne.

  • Dans multiselect mode, nous utiliserions Files à la place, qui renvoie une collection de FileInfo objets.

FileStream

La deuxième approche de file access comme mentionné ci-dessus est d'utiliser le FileStream classe ou des types associés dans le System.IOespace de noms directement. Il n'y a pas grand-chose à dire à ce sujet, car pour la plupart, c'est similaire à l'accès aux fichiers avec le.NET Framework.

Cependant, il y a quelques rebondissements spécifiques à Silverlight.

  • Premièrement, cette approche vous permet d'accéder aux fichiers à tout moment sans intervention de l'utilisateur, et sans aucune indication visible évidente de l'activité des fichiers, seules les applications de confiance sont autorisées à utiliser cette technique. N'oubliez pas que vous devez manquer de navigateur pour obtenir une confiance accrue.

  • Le deuxième problème est que seuls les fichiers de certains dossiers spécifiques sont disponibles. Vous ne pouvez lire et écrire que les fichiers sous leUser's Documents, Music, Pictures, or Video files. L'une des raisons à cela est que Silverlight fonctionne sur plusieurs plates-formes et que la structure du système de fichiers pour, par exemple, un Mac Apple, est très différente de celle de Windows. Par conséquent, l'accès aux fichiers multiplateforme doit fonctionner en termes d'un ensemble limité de dossiers disponibles sur tous les systèmes pris en charge par Silverlight.

  • Étant donné que ces dossiers se trouvent à des emplacements différents sur différents systèmes d'exploitation et que leur emplacement varie généralement d'un utilisateur à l'autre, vous devez utiliser le Environment.GetFolderPath méthode pour découvrir l'emplacement réel au moment de l'exécution.

  • Vous pouvez inspecter la structure des répertoires sous les points de départ. leDirectory et DirectoryInfo classes dans le System.IO namespace vous permet d'énumérer des fichiers et des répertoires.

Prenons un exemple simple dans lequel le fichier peut s'ouvrir via OpenFileDialog et enregistrez du texte dans le fichier via SaveFileDialog.

Vous trouverez ci-dessous le code XAML dans lequel deux boutons et un text box sont créées.

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

Vous trouverez ci-dessous le code C # pour l'implémentation des événements de clic dans lequel le fichier est ouvert et enregistré.

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(); 
               } 
            } 
         }  
      } 
   } 
}

Lorsque le code ci-dessus est compilé et exécuté, vous verrez la page Web suivante, qui contient deux boutons.

Clique le Open bouton, qui ouvrira OpenFileDialog pour sélectionner un fichier texte.

Sélectionnez un fichier texte et cliquez sur Open, vous verrez le texte sur la zone de texte.

Pour enregistrer le texte dans le fichier, mettez à jour le texte.

Clique le Save pour enregistrer les modifications dans un nouveau fichier texte ou un fichier existant.

Pour enregistrer les modifications apportées au fichier texte existant, sélectionnez le fichier texte dans SaveFileDialog, mais si vous souhaitez enregistrer les modifications apportées au nouveau fichier, écrivez le nom du fichier et cliquez sur le bouton Save bouton.