В этой главе мы увидим, как приложения 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, чтобы выбрать текстовый файл.
Выберите текстовый файл и нажмите Открыть , вы увидите текст в текстовом поле.
Чтобы сохранить текст в файл, обновите текст.
Нажмите кнопку Сохранить , чтобы сохранить изменения в новом текстовом или существующем файле.
Чтобы сохранить изменения в существующем текстовом файле, выберите текстовый файл в SaveFileDialog , но если вы хотите сохранить изменения в новом файле, напишите имя файла и нажмите кнопку « Сохранить» .