Silverlight - 文件访问



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

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

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

  • 第三个选项是隔离存储,我们将在后面讨论。

打开和保存文件对话框

SaveFileDialog

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

一些重要的功能包括:

  • 要使用它,我们创建SaveFileDialog类的实例。

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

  • 您可能想知道那里与True进行冗余比较的原因。如果ShowDialog返回True值,这意味着用户已选择了一个文件。因此,我们可以继续调用OpenFile方法,该方法返回一个Stream

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

OpenFileDialog

OpenFileDialog在使用上类似于SaveFileDialog。显然,您始终选择现有文件而不是新文件,但还有另一个重要区别。

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

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

  • 这里,在下面给出的示例中,我们处于单文件模式。因此,我们使用File,并对返回的FileInfo对象调用OpenRead

  • 多选模式下,我们将使用Files代替,它返回一个FileInfo对象的集合。

FileStream

如上所述,访问文件的第二种方法是直接使用FileStream类或System.IO命名空间中的相关类型。对此没有太多可说的,因为在大多数情况下,它类似于使用完整.NET Framework进行文件访问。

但是,有一些 Silverlight 特定的变化。

  • 首先,这种方法允许您在任何时间访问文件,无需用户干预,也无需任何明显的可见文件活动指示,只有受信任的应用程序才能使用此技术。请记住,您需要在浏览器外运行才能获得提升的信任。

  • 第二个问题是,只有某些特定文件夹中的文件可用。您只能读取和写入位于用户的文档、音乐、图片或视频文件下的文件。这样做的原因之一是 Silverlight 在多个平台上运行,并且例如 Apple Mac 的文件系统结构与 Windows 的文件系统结构非常不同。因此,跨平台文件访问必须根据所有 Silverlight 支持的系统上都可用的有限文件夹集来工作。

  • 由于这些文件夹在不同的操作系统上位于不同的位置,并且它们的位置通常因用户而异,因此您需要使用Environment.GetFolderPath方法在运行时发现实际位置。

  • 您可以检查起始点下方的目录结构。System.IO命名空间中的DirectoryDirectoryInfo类允许您枚举文件和目录。

考虑一个简单的示例,其中文件可以通过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以选择文本文件。

OpenFileDialog

选择一个文本文件并点击打开,您将在文本框中看到文本。

OpenSaveTextFile

要将文本保存到文件,请更新文本。

OpenSaveTextFile

点击保存按钮将更改保存到新文本文件或现有文件。

New Text File

要将更改保存到现有的文本文件,请在SaveFileDialog中选择该文本文件,但如果要将更改保存到新文件,请写入文件名并点击保存按钮。

SaveFileDialog
广告