TOC

This article has been localized into Spanish by the community.

Diálogos:

El diálogo OpenFileDialog

Cada vez que abra o guarde un archivo en casi cualquier aplicación de Windows, verá aproximadamente los mismos cuadros de diálogo para hacerlo. La razón es, por supuesto, que estos cuadros de diálogos forman parte de la API de Windows y, por lo tanto, también son accesibles para los desarrolladores en la plataforma de Windows.

En WPF, encontrará cuadros de diálogo estándares para abrir y guardar archivos en el espacio de nombres Microsoft.Win32. En este artículo, nos centraremos en la clase OpenFileDialog, que hace que sea muy fácil mostrar un cuadro de diálogo para abrir uno o varios archivos.

Ejemplo sencillo de OpenFileDialog

Comencemos usando OpenFileDialog, sin ninguna opción adicional, para cargar un archivo en un control TextBox:

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFile_Click">Open file</Button>
        </WrapPanel>
        <TextBox Name="txtEditor" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogSample : Window
	{
		public OpenFileDialogSample()
		{
			InitializeComponent();
		}

		private void btnOpenFile_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			if(openFileDialog.ShowDialog() == true)
				txtEditor.Text = File.ReadAllText(openFileDialog.FileName);
		}
	}
}

Una vez haga clic en el botón "Open file", se creará una instancia de OpenFileDialog y se mostrará. Según la versión de Windows que esté utilizando y el tema seleccionado, se verá algo como esto:

La función "ShowDialog()" devolverá un valor booleano que se puede ser nulo, lo que significa que puede ser falso, verdadero o nulo. Si el usuario selecciona un archivo y presiona "Abrir", el resultado es True y, en ese caso, intentamos cargar el archivo en el control TextBox. Obtenemos la ruta completa del archivo seleccionado utilizando la propiedad FileName de OpenFileDialog.

Filtrar

Normalmente, cuando desea que su usuario abra un archivo en su aplicación, desea limitarlo a uno o dos tipos de archivos. Por ejemplo, Word casi siempre abre archivos de Word (con la extensión .doc o .docx) y el Bloc de notas casi siempre abre archivos de texto (con la extensión .txt).

Puede especificar un filtro para su OpenFileDialog para indicar al usuario qué tipos de archivos deberían abrir en su aplicación, así como para limitar los archivos que se muestran para ofrecer una mejor visión general. Esto puede hacerlo con la propiedad Filter, que podemos añadir al ejemplo anterior, justo después de inicializar el diálogo, de la siguiente manera:

openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";

Aquí está el resultado:

Observe cómo el cuadro de diálogo ahora tiene un desplegable para seleccionar los tipos de archivo, y que los archivos mostrados están limitados a los que tienen la(s) extensión(es) especificada(s) por el tipo de archivo seleccionado.

El formato para especificar el filtro puede lucir un poco extraño a primera vista, pero funciona especificando una versión de la extensión del fichero que sea legible para las personas y una versión para la computadora que la pueda analizar facilmente, separada por una barra vertical(|) . Si quieres mas que un tipo de fichero, como lo hacemos en el ejemplo anterior debes de poner la información también separada con una barra vertical.

Para resumir, la siguiente parte significa que queremos que el tipo de fichero sea nombrado "Text files"(*.txt) (la extensión en el paréntesis es una cortesía hacia el usuario, de esa manera sabrá cúal extensión(es) se encuentran incluidas ) y la segunda parte le dice al cuadro de diálogo que muestre los ficheros con una extensión .txt:

Text files (*.txt)|*.txt

Cada tipo de fichero puede tener multiple extensiones. Por ejemplo, fichero de imagenes pueden ser especificados como ficheros de ambos tipos JPEG y PNG, ejemplo:

openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";

Simplemente separa cada extension con un punto y coma en la segunda parte (la parte de la computadora) - en la primera parte, puedes formatearla de la manera que prefieras, aunque la mayoria de los desarrolladores parece que utilizan la misma notación para ambas partes, como se muestra en el ejemplo anterior.

Estableciendo el directorio inicial

El directorio inicial utilizado por el diálogo OpenFileDialog es decidido por Window, pero utilizando la propiedad InitialDirectory puedes sobreescribirla. Habitualmente le darás el valor de un directorio especificado por el usuario, el directorio de la aplicación o tal vez el último directorio utilizado. Puedes darle el valor de una ruta en formato string, como aquí:

openFileDialog.InitialDirectory = @"c:\temp\";

Si quieres utilizar una de las carpetas especiales de Windows, p.e. el 'Escritorio', 'Mis Documentos' o el directorio de 'Archivos de Programa' debes tener un especial cuidado, pues estas pueden cambiar entre versiones de Windows y también pueden depender del usuario que esté conectado. El framework .NET puede ayudar, simplemente utilizando la clase Environment y sus miembros para tratar con carpetas especiales:

openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

En este caso, tomo la ruta de acceso para la carpeta de 'Mis Documentos', pero echa un vistazo a la enumeración de SpecialFolder - contiene valores para muchas interesantes rutas de acceso. Para una lista completa, por favor observa este MSDN articulo

Multiples archivos

Si tu aplicación admite varios archivos abiertos, o simplemente quieres utilizar OpenFileDialog para seleccionar mas de un archivo de golpe, necesidad activar la propiedad Multiselect. En el siguiente ejemplo es justo lo que hemos hecho, y como cortesía hacía ti, querido lector, también hemos aplicado todas las técnicas previamente mencionadas, incluyendo filtros y estableciendo el directorio inicial.

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogMultipleFilesSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogMultipleFilesSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFiles_Click">Open files</Button>
        </WrapPanel>
        <ListBox Name="lbFiles" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogMultipleFilesSample : Window
	{
		public OpenFileDialogMultipleFilesSample()
		{
			InitializeComponent();
		}

		private void btnOpenFiles_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			openFileDialog.Multiselect = true;
			openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
			openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
			if(openFileDialog.ShowDialog() == true)
			{
				foreach(string filename in openFileDialog.FileNames)
					lbFiles.Items.Add(Path.GetFileName(filename));
			}
		}
	}
}

Si pruebas este código, podrás ver que ahora puedes seleccionar multiples ficheros del mismo directorio, ya sea presionando Ctrl o Shift y haciendo click con el ratón. Una vez aceptado, este ejemplo simplemente adiciona los ficheros al control del ListBox, iterando a travéz de la propiedad de FileNames .

Resumen

Como puedes ver, utilizando OpenFileDialog en WPF es muy sencillo y realmente se ocupa de la mayor parte del trabajo por ti. Sea consciente de que para reducir la cantidad de lineas de código en estos ejemplos no se realizó ningun manejo de excepciones. Cuando se trabaja con ficheros y se realizan tareas de IO(entradas y salidas) en general, siempre debes de mirar por excepciones, porque puedes facilmente ocurrir debido a un fichero bloqueado, que no exista la ruta o problemas relacionados.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!