ver texto ruta por obtener mostrar extensión extensiones extension explorador cómo con buscar archivos archivo c# winforms

c# - texto - ¿Cómo puedo obtener el ícono de tipo de archivo que muestra el Explorador de Windows?



mostrar extensiones de archivos windows 7 (4)

Editar: Aquí hay una versión sin PInvoke.

[StructLayout(LayoutKind.Sequential)] public struct SHFILEINFO { public IntPtr hIcon; public IntPtr iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; }; public const uint SHGFI_ICON = 0x100; public const uint SHGFI_LARGEICON = 0x0; // ''Large icon public const uint SHGFI_SMALLICON = 0x1; // ''Small icon [DllImport("shell32.dll")] public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); [DllImport("User32.dll")] public static extern int DestroyIcon(IntPtr hIcon); public static System.Drawing.Icon GetSystemIcon(string sFilename) { //Use this to get the small Icon IntPtr hImgSmall; //the handle to the system image list //IntPtr hImgLarge; //the handle to the system image list APIFuncs.SHFILEINFO shinfo = new APIFuncs.SHFILEINFO(); hImgSmall = APIFuncs.SHGetFileInfo(sFilename, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), APIFuncs.SHGFI_ICON | APIFuncs.SHGFI_SMALLICON); //Use this to get the large Icon //hImgLarge = SHGetFileInfo(fName, 0, // ref shinfo, (uint)Marshal.SizeOf(shinfo), // Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON); //The icon is returned in the hIcon member of the shinfo struct System.Drawing.Icon myIcon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shinfo.hIcon).Clone(); DestroyIcon(shinfo.hIcon); // Cleanup return myIcon; }

primera pregunta aquí. Estoy desarrollando un programa en C # (.NET 3.5) que muestra los archivos en una vista de lista. Me gustaría que la vista "icono grande" muestre el ícono que Windows Explorer usa para ese tipo de archivo, de lo contrario tendré que usar algún código existente como este:

private int getFileTypeIconIndex(string fileName) { string fileLocation = Application.StartupPath + "//Quarantine//" + fileName; FileInfo fi = new FileInfo(fileLocation); switch (fi.Extension) { case ".pdf": return 1; case ".doc": case ".docx": case ".docm": case ".dotx":case ".dotm": case ".dot":case ".wpd": case ".wps": return 2; default: return 0; } }

El código anterior devuelve un número entero que se utiliza para seleccionar un icono de una lista de imágenes que llené con algunos iconos comunes. Funciona bien, ¡pero necesitaría agregar todas las extensiones bajo el sol! ¿Hay una mejor manera? ¡Gracias!


Es posible que el uso de Icon.ExtractAssociatedIcon sea mucho más simple (un enfoque administrado) que con SHGetFileInfo. Pero cuidado: dos archivos con la misma extensión pueden tener diferentes iconos.


Los iconos de archivo se mantienen en el registro. Es un poco intrincado pero funciona algo así como

  • Tome la extensión de archivo y busque la entrada de registro para ello, por ejemplo .DOC Obtenga el valor predeterminado para esa configuración de registro, "Word.Document.8"
  • Ahora busca ese valor en el registro.
  • Mire el valor predeterminado para la clave de registro "Icono predeterminado", en este caso, C: / Windows / Installer {91120000-002E-0000-0000-0000000FF1CE} / wordicon.exe, 1
  • Abra el archivo y obtenga el ícono, usando cualquier número después de la coma como indexador.

Hay algún código de muestra en CodeProject


Utilicé la siguiente solución de codeproject en uno de mis proyectos recientes

Obtener (y administrar) iconos de archivos y carpetas usando SHGetFileInfo en C #

El proyecto de demostración es bastante explicativo, pero básicamente solo tienes que hacer:

private System.Windows.Forms.ListView FileView; private ImageList _SmallImageList = new ImageList(); private ImageList _LargeImageList = new ImageList(); private IconListManager _IconListManager;

en el constructor:

_SmallImageList.ColorDepth = ColorDepth.Depth32Bit; _LargeImageList.ColorDepth = ColorDepth.Depth32Bit; _SmallImageList.ImageSize = new System.Drawing.Size(16, 16); _LargeImageList.ImageSize = new System.Drawing.Size(32, 32); _IconListManager = new IconListManager(_SmallImageList, _LargeImageList); FileView.SmallImageList = _SmallImageList; FileView.LargeImageList = _LargeImageList;

y finalmente cuando creas el ListViewItem:

ListViewItem item = new ListViewItem(file.Name, _IconListManager.AddFileIcon(file.FullName));

Funcionó muy bien para mí