在本章中,我们将了解Silverlight应用程序如何访问最终用户计算机上的文件.在Silverlight中访问文件有三种主要方法.选择将取决于您需要使用文件的原因,以及您是否正在编写受信任的应用程序.
最灵活的选择是使用文件对话框类.使用打开和保存文件对话框,只要用户具有适当的权限,您就可以访问最终用户选择的任何文件.用户同意是这种方法的核心.用户必须选择要读取的文件,或者在保存时,他们会选择一个文件来覆盖或为您选择一个位置和文件名.
第二种选择是使用 System.IO 命名空间中的各种类. Silverlight提供诸如 FileStream,StreamWriter,FileInfo,Directory,和 DirectoryInfo 之类的类,所有这些都可以编写打开和访问文件的代码,而无需获取用户参与其中.这对开发人员来说可能更方便,但当然,大多数用户不希望任何作为网页一部分下载的旧代码能够在他们的文件中搜索.
第三个选项是隔离存储,稍后我们将讨论.
SaveFileDialog 类显示标准操作系统提供的用户界面,用于选择保存位置文件.
一些重要的功能是 :
要使用它,我们创建 SaveFileDialog 类的实例.
调用 ShowDialog ,使其显示,并且返回代码告诉我们用户是否选择了保存文件的位置,或取消了对话框.
您可能想知道与
如果我们想要,我们可以发现用户选择的名称.该对话框提供了一个名为 SafeFileName 的属性,但该属性不包含该路径.在任何情况下,写入数据的唯一方法是使用对话框返回的 Stream .从开发人员的角度来看,这只是一个普通的 .NET流,因此我们可以将其包装在 StreamWriter 中,以便将文本写入其中.
OpenFileDialog与 SaveFileDialog 类似.显然,你总是选择现有的文件而不是新文件,但还有另一个重要区别.
它提供名为 MultiSelect 的属性.如果将其设置为 True ,则用户可以选择多个文件.这意味着对话框需要稍微复杂的API.
SaveFileDialog 一次只处理一个文件,但是 OpenFileDialog 能够处理更多,因此它不提供 OpenFile 方法.我们需要扩展代码.根据对话框是否处于单个文件模式或 MultiSelect 模式,您可以使用其文件或文件 property.
这里,在下面给出的例子中,我们处于单文件模式.因此,我们使用文件,并在返回的 FileInfo 对象上调用 OpenRead .
在多选模式下,我们会使用文件,它会返回 FileInfo 对象的集合.
如上所述,文件访问的第二种方法是使用 FileStream 类,或直接在 System.IO 命名空间中的相关类型.关于这一点没有太多可说的,因为在大多数情况下,它与使用完整的 .NET Framework 的文件访问类似.
但是,那里是一些特定于Silverlight的曲折.
首先,这种方法可让您随时访问文件而无需用户干预,并且没有任何明显的文件活动可见指示,只允许受信任的应用程序使用此技术.请记住,您需要用完浏览器以获得更高的信任.
第二个问题是只有特定文件夹中的文件可用.您只能读取和写入用户的文档,音乐,图片或视频文件下的文件.其中一个原因是Silverlight在多个平台上运行,例如Apple Mac的文件系统结构与Windows的文件系统结构非常不同.因此,跨平台文件访问必须适用于Silverlight支持的所有系统上可用的有限文件夹集.
由于这些文件夹将是在不同操作系统的不同位置,它们的位置通常因用户而异,您需要使用 Environment.GetFolderPath 方法在运行时发现实际位置.
您可以检查起点下面的目录结构. System.IO 命名空间中的目录和 DirectoryInfo 类允许您枚举文件和目录.
考虑一个简单的例子,其中文件可以通过 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 选择一个文本文件.
选择一个文本文件并单击打开,您将在文本框中看到文本.
要将文本保存到文件中,请更新文本.
单击保存按钮将更改保存到新文本文件或现有文件.
保存对现有t的更改在ext文件中,选择 SaveFileDialog 中的文本文件,但是如果要保存对新文件的更改,请写入文件名并单击保存按钮.