Учебники

Silverlight — Доступ к файлам

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

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

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

  • Третий вариант — это изолированное хранилище , о котором мы поговорим позже.

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

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

Третий вариант — это изолированное хранилище , о котором мы поговорим позже.

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

SaveFileDialog

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

Некоторые важные особенности —

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

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

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

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

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

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

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

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

OpenFileDialog

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

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

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

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

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

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

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

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

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

FileStream

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

Тем не менее, есть несколько специфических особенностей Silverlight.

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

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

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

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

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

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

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

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

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

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

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

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

Нажмите кнопку Открыть , чтобы открыть OpenFileDialog, чтобы выбрать текстовый файл.

OpenFileDialog

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

OpenSaveTextFile

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

OpenSaveTextFile

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

Новый текстовый файл

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