visual ruta openfiledialog1 open obtener net configurar con asp archivo c# winforms openfiledialog

ruta - savefiledialog c#



¿Configurando el filtro a un OpenFileDialog para permitir los formatos de imagen típicos? (11)

Tengo este código, ¿cómo puedo permitir que acepte todos los formatos de imagen típicos? PNG, JPEG, JPG, GIF?

Esto es lo que tengo hasta ahora:

public void EncryptFile() { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; dialog.InitialDirectory = @"C:/"; dialog.Title = "Please select an image file to encrypt."; if (dialog.ShowDialog() == DialogResult.OK) { //Encrypt the selected file. I''ll do this later. :) } }

Observe que el filtro está configurado en archivos .txt. Podría cambiar a PNG, pero ¿qué pasa con los otros tipos?


Aquí hay un ejemplo de la sugerencia de ImageCodecInfo (en VB):

Dim ofd as new OpenFileDialog() ofd.Filter = "" Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders() Dim sep As String = String.Empty For Each c As ImageCodecInfo In codecs Dim codecName As String = c.CodecName.Substring(8).Replace("Codec", "Files").Trim() ofd.Filter = String.Format("{0}{1}{2} ({3})|{3}", ofd.Filter, sep, codecName, c.FilenameExtension) sep = "|" Next ofd.Filter = String.Format("{0}{1}{2} ({3})|{3}", ofd.Filter, sep, "All Files", "*.*")

Y se parece a esto:


De los documentos , la sintaxis de filtro que necesita es la siguiente:

Office Files|*.doc;*.xls;*.ppt

es decir, separe las múltiples extensiones con un punto y coma, por lo tanto, Image Files|*.jpg;*.jpeg;*.png;...


Esto es extremo, pero construí un filtro dinámico basado en bases de datos utilizando una tabla de base de datos de 2 columnas denominada FILE_TYPES, con los nombres de campo EXTENSION y DOCTYPE:

--------------------------------- | EXTENSION | DOCTYPE | --------------------------------- | .doc | Document | | .docx | Document | | .pdf | Document | | ... | ... | | .bmp | Image | | .jpg | Image | | ... | ... | ---------------------------------

Obviamente tuve muchos tipos y extensiones diferentes, pero lo estoy simplificando para este ejemplo. Aquí está mi función:

private static string GetUploadFilter() { // Desired format: // "Document files (*.doc, *.docx, *.pdf)|*.doc;*.docx;*.pdf|" // "Image files (*.bmp, *.jpg)|*.bmp;*.jpg|" string filter = String.Empty; string nameFilter = String.Empty; string extFilter = String.Empty; // Used to get extensions DataTable dt = new DataTable(); dt = DataLayer.Get_DataTable("SELECT * FROM FILE_TYPES ORDER BY EXTENSION"); // Used to cycle through doctype groupings ("Images", "Documents", etc.) DataTable dtDocTypes = new DataTable(); dtDocTypes = DataLayer.Get_DataTable("SELECT DISTINCT DOCTYPE FROM FILE_TYPES ORDER BY DOCTYPE"); // For each doctype grouping... foreach (DataRow drDocType in dtDocTypes.Rows) { nameFilter = drDocType["DOCTYPE"].ToString() + " files ("; // ... add its associated extensions foreach (DataRow dr in dt.Rows) { if (dr["DOCTYPE"].ToString() == drDocType["DOCTYPE"].ToString()) { nameFilter += "*" + dr["EXTENSION"].ToString() + ", "; extFilter += "*" + dr["EXTENSION"].ToString() + ";"; } } // Remove endings put in place in case there was another to add, and end them with pipe characters: nameFilter = nameFilter.TrimEnd('' '').TrimEnd('',''); nameFilter += ")|"; extFilter = extFilter.TrimEnd('';''); extFilter += "|"; // Add the name and its extensions to our main filter filter += nameFilter + extFilter; extFilter = ""; // clear it for next round; nameFilter will be reset to the next DOCTYPE on next pass } filter = filter.TrimEnd(''|''); return filter; } private void UploadFile(string fileType, object sender) { Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); string filter = GetUploadFilter(); dlg.Filter = filter; if (dlg.ShowDialog().Value == true) { string fileName = dlg.FileName; System.IO.FileStream fs = System.IO.File.OpenRead(fileName); byte[] array = new byte[fs.Length]; // This will give you just the filename fileName = fileName.Split(''//')[fileName.Split(''//').Length - 1]; ...

Debería ceder un filtro que se vea así:


Me gusta la respuesta de Tom Faust la mejor. Aquí hay una versión C # de su solución, pero simplificando un poco las cosas.

var codecs = ImageCodecInfo.GetImageEncoders(); var codecFilter = "Image Files|"; foreach (var codec in codecs) { codecFilter += codec.FilenameExtension + ";"; } dialog.Filter = codecFilter;


Para aquellos que no quieren recordar la sintaxis cada vez que aquí hay una simple encapsulación:

public class FileDialogFilter : List<string> { public string Explanation { get; } public FileDialogFilter(string explanation, params string[] extensions) { Explanation = explanation; AddRange(extensions); } public string GetFileDialogRepresentation() { if (!this.Any()) { throw new ArgumentException("No file extension is defined."); } StringBuilder builder = new StringBuilder(); builder.Append(Explanation); builder.Append(" ("); builder.Append(String.Join(", ", this)); builder.Append(")"); builder.Append("|"); builder.Append(String.Join(";", this)); return builder.ToString(); } } public class FileDialogFilterCollection : List<FileDialogFilter> { public string GetFileDialogRepresentation() { return String.Join("|", this.Select(filter => filter.GetFileDialogRepresentation())); } }

Uso:

FileDialogFilter filterImage = new FileDialogFilter("Image Files", "*.jpeg", "*.bmp"); FileDialogFilter filterOffice = new FileDialogFilter("Office Files", "*.doc", "*.xls", "*.ppt"); FileDialogFilterCollection filters = new FileDialogFilterCollection { filterImage, filterOffice }; OpenFileDialog fileDialog = new OpenFileDialog { Filter = filters.GetFileDialogRepresentation() }; fileDialog.ShowDialog();


Para filtrar archivos de imágenes, utilice este ejemplo de código.

//Create a new instance of openFileDialog OpenFileDialog res = new OpenFileDialog(); //Filter res.Filter = "Image Files|*.jpg;*.jpeg;*.png;*.gif;*.tif;..."; //When the user select the file if (res.ShowDialog() == DialogResult.OK) { //Get the file''s path var filePath = res.FileName; //Do something .... }


Para hacer coincidir una lista de diferentes categorías de archivos, puede usar el filtro así:

var dlg = new Microsoft.Win32.OpenFileDialog() { DefaultExt = ".xlsx", Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv" };


Para las imágenes, puede obtener los códecs disponibles de GDI (System.Drawing) y construir su lista con un poco de trabajo. Esta sería la forma más flexible de ir.

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();


Siga este patrón si está buscando archivos de imágenes:

dialog.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";


Solo un necrocommento para usar string.Join y LINQ.

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); dlgOpenMockImage.Filter = string.Format("{0}| All image files ({1})|{1}|All files|*", string.Join("|", codecs.Select(codec => string.Format("{0} ({1})|{1}", codec.CodecName, codec.FilenameExtension)).ToArray()), string.Join(";", codecs.Select(codec => codec.FilenameExtension).ToArray()));


La solución completa en C # está aquí:

private void btnSelectImage_Click(object sender, RoutedEventArgs e) { // Configure open file dialog box Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.Filter = ""; ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); string sep = string.Empty; foreach (var c in codecs) { string codecName = c.CodecName.Substring(8).Replace("Codec", "Files").Trim(); dlg.Filter = String.Format("{0}{1}{2} ({3})|{3}", dlg.Filter, sep, codecName, c.FilenameExtension); sep = "|"; } dlg.Filter = String.Format("{0}{1}{2} ({3})|{3}", dlg.Filter, sep, "All Files", "*.*"); dlg.DefaultExt = ".png"; // Default file extension // Show open file dialog box Nullable<bool> result = dlg.ShowDialog(); // Process open file dialog box results if (result == true) { // Open document string fileName = dlg.FileName; // Do something with fileName } }