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