Silverlight - Acceso a archivos

En este capítulo, veremos cómo las aplicaciones de Silverlight pueden acceder a archivos en la computadora del usuario final. Hay tres formas principales de acceder a los archivos en Silverlight. La elección dependerá de la razón por la que necesita usar archivos y de si está escribiendo una aplicación confiable.

  • La opción más flexible es utilizar el file dialogclases. Con elOpen y Savecuadros de diálogo de archivo, puede obtener acceso a cualquier archivo que elija el usuario final, siempre que el usuario tenga los permisos adecuados. El consentimiento del usuario es fundamental para este enfoque. El usuario tiene que elegir qué archivo leer o, al guardar, elegir un archivo para sobrescribirlo o elegir una ubicación y un nombre de archivo por usted.

  • La segunda opción es utilizar las diversas clases en el System.IOespacio de nombres. Silverlight ofrece clases comoFileStream, StreamWriter, FileInfo, Directory, y DirectoryInfo, todo lo cual hace posible escribir código que abre y accede a archivos sin necesidad de involucrar al usuario. Eso puede ser más conveniente para el desarrollador, pero, por supuesto, la mayoría de los usuarios no querrían descargar ningún código antiguo como parte de una página web para poder buscar en sus archivos.

  • La tercera opción es Isolated Storage, que discutiremos más adelante.

Diálogos para abrir y guardar archivos

SaveFileDialog

los SaveFileDialog class muestra la interfaz de usuario estándar proporcionada por el sistema operativo para elegir dónde guardar un archivo.

Algunas características importantes son:

  • Para usarlo, creamos una instancia del SaveFileDialog clase.

  • Vocación ShowDialog, hace que aparezca y el código de retorno nos dice si el usuario seleccionó un lugar para guardar el archivo o canceló el diálogo.

  • Quizás se esté preguntando acerca de la comparación de apariencia redundante con Trueallí. SiShowDialog devoluciones Truevalue, lo que significa que el usuario ha seleccionado un archivo. Entonces podemos continuar llamando alOpenFile método, que nos devuelve un Stream.

  • Si queremos, podemos descubrir el nombre que eligió el usuario. El diálogo proporciona una propiedad llamadaSafeFileName, pero eso no incluye la ruta. En cualquier caso, la única forma de escribir datos es utilizar elStreamdevuelto por el diálogo. Desde la perspectiva de un desarrollador, esto es solo un.NET stream, para que podamos envolverlo en un StreamWriter, para escribir texto en él.

OpenFileDialog

El OpenFileDialog es similar en uso al SaveFileDialog. Obviamente, siempre está eligiendo un archivo existente en lugar de uno nuevo, pero hay otra diferencia importante.

  • Ofrece una propiedad llamada MultiSelect. Si lo configuras enTrue, el usuario puede elegir varios archivos. Esto significa que el cuadro de diálogo necesita una API un poco más compleja.

  • los SaveFileDialog solo se ocupa de un archivo a la vez, pero OpenFileDialog es capaz de hacer frente a más, por lo que no ofrece una OpenFilemétodo. Necesitamos expandir el código. Dependiendo de si el diálogo está ensingle file modo, o MultiSelect modo, utiliza su Fileo Files propiedad.

  • Aquí, en el ejemplo que se muestra a continuación, estamos en modo de archivo único. Por lo tanto, usamosFiley llamamos OpenRead sobre el FileInfo objeto que regresa.

  • En multiselect modo, usaríamos Files en su lugar, que devuelve una colección de FileInfo objetos.

FileStream

El segundo enfoque para file access como se mencionó anteriormente es utilizar el FileStream clase, o tipos relacionados en el System.IOespacio de nombres directamente. No hay mucho que decir sobre esto, porque en su mayor parte, es similar al acceso a archivos con el.NET Framework.

Sin embargo, hay un par de giros específicos de Silverlight.

  • Primero, este enfoque le permite acceder a los archivos en cualquier momento sin la intervención del usuario, y sin ninguna indicación visible obvia de la actividad del archivo, solo las aplicaciones confiables pueden usar esta técnica. Recuerde, debe quedarse sin navegador para obtener una mayor confianza.

  • El segundo problema es que solo están disponibles los archivos de determinadas carpetas específicas. Solo puede leer y escribir archivos que estén bajo elUser's Documents, Music, Pictures, or Video files. Una razón de esto es que Silverlight se ejecuta en múltiples plataformas y la estructura del sistema de archivos para, digamos, un Apple Mac, es muy diferente a la de Windows. Por lo tanto, el acceso a archivos multiplataforma tiene que funcionar en términos de un conjunto limitado de carpetas que están disponibles en todos los sistemas compatibles con Silverlight.

  • Dado que estas carpetas estarán en diferentes ubicaciones en diferentes sistemas operativos, y su ubicación generalmente variará de un usuario a otro, debe usar el Environment.GetFolderPath método para descubrir la ubicación real en tiempo de ejecución.

  • Puede inspeccionar la estructura del directorio debajo de los puntos de partida. losDirectory y DirectoryInfo clases en el System.IO el espacio de nombres le permite enumerar archivos y directorios.

Considere un ejemplo simple en el que el archivo se puede abrir mediante OpenFileDialog y guarde algo de texto en el archivo a través de SaveFileDialog.

A continuación se muestra el código XAML en el que dos botones y un text box son creados.

<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>

A continuación se muestra el código C # para la implementación de eventos de clic en el que se abre y se guarda el archivo.

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(); 
               } 
            } 
         }  
      } 
   } 
}

Cuando se compile y ejecute el código anterior, verá la siguiente página web, que contiene dos botones.

Haga clic en el Open botón, que se abrirá OpenFileDialog para seleccionar un archivo de texto.

Seleccione un archivo de texto y haga clic en Open, verá el texto en el cuadro de texto.

Para guardar texto en el archivo, actualice el texto.

Haga clic en el Save para guardar los cambios en un archivo de texto nuevo o en un archivo existente.

Para guardar cambios en el archivo de texto existente, seleccione el archivo de texto en SaveFileDialog, pero si desea guardar los cambios en el nuevo archivo, escriba el nombre del archivo y haga clic en el Save botón.