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 кнопка.