Silverlight - 文件访问


在本章中,我们将了解 Silverlight 应用程序如何访问最终用户计算机上的文件。在 Silverlight 中访问文件有三种主要方式。选择将取决于您需要使用文件的原因,以及您是否正在编写可信的应用程序。

  • 最灵活的选项是使用文件对话框类。通过“打开”“保存文件”对话框,只要用户具有适当的权限,您就可以访问最终用户选择的任何文件。用户同意是这种方法的核心。用户必须选择要读取的文件,或者在保存时,他们选择要覆盖的文件或为您选择位置和文件名。

  • 第二个选项是使用System.IO命名空间中的各种类。Silverlight 提供了FileStream、StreamWriter、FileInfo、DirectoryDirectoryInfo等类,所有这些都使得编写打开和访问文件的代码成为可能,而无需用户参与。这对于开发人员来说可能更方便,但当然,大多数用户不希望将任何旧代码作为网页的一部分下载,以便能够在他们的文件中搜索。

  • 第三个选项是独立存储,我们稍后会讨论。

打开和保存文件对话框

保存文件对话框

SaveFileDialog类显示标准操作系统提供的用户界面,用于选择保存文件的位置

一些重要的功能是 -

  • 为了使用它,我们创建SaveFileDialog类的一个实例。

  • 调用ShowDialog,使其出现,返回代码告诉我们用户是否选择了保存文件的位置,或取消了对话框。

  • 您可能想知道与True 的看起来多余的比较。如果ShowDialog返回True值,则表示用户已经选择了一个文件。因此我们可以继续调用OpenFile方法,该方法返回一个Stream

  • 如果我们愿意,我们可以发现用户选择的名称。该对话框提供了一个名为SafeFileName 的属性,但不包括路径。无论如何,写入数据的唯一方法是使用对话框返回的Stream 。从开发人员的角度来看,这只是一个普通的.NET流,因此我们可以将其包装在StreamWriter中,以将文本写入其中。

打开文件对话框

OpenFileDialog 的使用与SaveFileDialog类似。显然,您总是选择现有文件而不是新文件,但还有另一个重要区别。

  • 它提供了一个名为MultiSelect的属性。如果将其设置为True,用户可以选择多个文件。这意味着该对话框需要稍微复杂一些的 API。

  • SaveFileDialog一次只能处理一个文件,但OpenFileDialog能够处理更多文件,因此它不提供OpenFile方法。我们需要扩展代码。根据对话框是处于单文件模式还是多选模式,您可以使用其FileFiles属性。

  • 在下面给出的示例中,我们处于单文件模式。因此,我们使用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 代码。

<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中选择文本文件,但如果要将更改保存到新文件,请写入文件名并单击“保存”按钮。

保存文件对话框