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