Silverlight - доступ к файлам

В этой главе мы увидим, как приложения Silverlight могут получать доступ к файлам на компьютере конечного пользователя. В Silverlight есть три основных способа доступа к файлам. Выбор будет зависеть от причины, по которой вам нужно использовать файлы, и от того, пишете ли вы доверенное приложение.

  • Самый гибкий вариант - использовать file dialogклассы. СOpen и Saveфайловых диалогов, вы можете получить доступ к любому файлу, который выберет конечный пользователь, если у пользователя есть соответствующие разрешения. Согласие пользователя занимает центральное место в этом подходе. Пользователь должен выбрать, какой файл читать, или при сохранении он выбирает файл для перезаписи или выбирает местоположение и имя файла для вас.

  • Второй вариант - использовать различные классы в System.IOпространство имен. Silverlight предлагает такие классы, какFileStream, StreamWriter, FileInfo, Directory, и DirectoryInfo, все из которых позволяют писать код, который открывает файлы и обращается к ним без необходимости вовлечения пользователя. Это может быть более удобным для разработчика, но, конечно, большинство пользователей не захотят, чтобы какой-либо старый код загружался как часть веб-страницы, чтобы иметь возможность искать в своих файлах.

  • Третий вариант - Isolated Storage, о котором мы поговорим позже.

Диалоги открытия и сохранения файла

SaveFileDialog

В SaveFileDialog Класс показывает стандартный пользовательский интерфейс операционной системы для выбора места сохранения файла.

Некоторые важные функции -

  • Чтобы использовать его, мы создаем экземпляр SaveFileDialog класс.

  • Вызов ShowDialog, вызывает его появление, а код возврата сообщает нам, выбрал ли пользователь место для сохранения файла или отменил диалог.

  • Вам может быть интересно узнать, как выглядит избыточное сравнение с Trueтам. ЕслиShowDialog возвращается Trueзначение, которое означает, что пользователь выбрал файл. Итак, мы можем позвонить вOpenFile метод, который возвращает нам Stream.

  • Если мы хотим, мы можем узнать имя, выбранное пользователем. Диалог предоставляет свойство, называемоеSafeFileName, но это не включает путь. В любом случае единственный способ записать данные - использоватьStreamвозвращается диалогом. С точки зрения разработчика это обычная.NET stream, так что мы можем обернуть его в StreamWriter, чтобы написать в нем текст.

OpenFileDialog

OpenFileDialog похож на использование SaveFileDialog. Очевидно, что вы всегда выбираете существующий файл, а не новый, но есть еще одно важное отличие.

  • Он предлагает недвижимость под названием MultiSelect. Если вы установите это наTrue, пользователь может выбрать несколько файлов. Это означает, что диалогу требуется немного более сложный API.

  • В SaveFileDialog работает только с одним файлом за раз, но OpenFileDialog способен справиться с большим, поэтому он не предлагает OpenFileметод. Нам нужно расширить код. В зависимости от того, находится ли диалог вsingle file режим, или MultiSelect режим, вы используете либо его File, или же Files свойство.

  • Здесь, в приведенном ниже примере, мы находимся в режиме одного файла. Следовательно, мы используемFile, и мы звоним OpenRead на FileInfo объект, который возвращается.

  • В multiselect режим, мы бы использовали Files вместо этого, который возвращает коллекцию FileInfo объекты.

FileStream

Второй подход к file access как упоминалось выше, заключается в использовании FileStream class или связанные типы в System.IOпространство имен напрямую. Об этом особо и нечего сказать, потому что по большей части это похоже на доступ к файлам с полным.NET Framework.

Однако есть несколько особенностей Silverlight.

  • Во-первых, этот подход позволяет вам получать доступ к файлам в любое время без вмешательства пользователя и без каких-либо очевидных видимых указаний на файловую активность, только доверенным приложениям разрешено использовать этот метод. Помните, что вам нужно закрыть браузер, чтобы получить повышенное доверие.

  • Вторая проблема заключается в том, что доступны только файлы в определенных папках. Вы можете читать и записывать только файлы, находящиеся подUser's Documents, Music, Pictures, or Video files. Одна из причин этого заключается в том, что Silverlight работает на нескольких платформах, а структура файловой системы, скажем, для Apple Mac сильно отличается от структуры файловой системы Windows. Следовательно, межплатформенный доступ к файлам должен работать с ограниченным набором папок, которые доступны во всех системах, поддерживаемых Silverlight.

  • Поскольку эти папки будут находиться в разных местах в разных операционных системах, и их расположение обычно будет варьироваться от одного пользователя к другому, вам необходимо использовать Environment.GetFolderPath метод определения фактического местоположения во время выполнения.

  • Вы можете проверить структуру каталогов под начальными точками. ВDirectory и DirectoryInfo классы в System.IO пространство имен позволяет вам перечислять файлы и каталоги.

Рассмотрим простой пример, в котором файл можно открыть через OpenFileDialog и сохраните текст в файл через SaveFileDialog.

Ниже приведен код XAML, в котором две кнопки и text box созданы.

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

Ниже приведен код C # для реализации событий щелчка, в котором файл открывается и сохраняется.

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

Когда приведенный выше код скомпилирован и запущен, вы увидите следующую веб-страницу, содержащую две кнопки.

Щелкните значок Open кнопка, которая откроется OpenFileDialog для выбора текстового файла.

Выберите текстовый файл и нажмите Open, вы увидите текст в текстовом поле.

Чтобы сохранить текст в файл, обновите текст.

Щелкните значок Save кнопку, чтобы сохранить изменения либо в новый текстовый файл, либо в существующий файл.

Чтобы сохранить изменения в существующем текстовом файле, выберите текстовый файл в SaveFileDialog, но если вы хотите сохранить изменения в новом файле, напишите имя файла и нажмите кнопку Save кнопка.