private static uint ToFileIconFlags(IconSize size, FileIconOptions options) { uint flags = NativeMethods.SHGFI_ICON; switch (size) { case IconSize.Large: flags |= NativeMethods.SHGFI_LARGEICON; break; case IconSize.Small: flags |= NativeMethods.SHGFI_SMALLICON; break; case IconSize.ShellSize: flags |= NativeMethods.SHGFI_SHELLICONSIZE; break; } if ((options & FileIconOptions.LinkOverlay) == FileIconOptions.LinkOverlay) { flags |= NativeMethods.SHGFI_LINKOVERLAY; } if ((options & FileIconOptions.Selected) == FileIconOptions.Selected) { flags |= NativeMethods.SHGFI_SELECTED; } if ((options & FileIconOptions.OpenIcon) == FileIconOptions.OpenIcon) { flags |= NativeMethods.SHGFI_OPENICON; } if ((options & FileIconOptions.Overlays) == FileIconOptions.Overlays) { flags |= NativeMethods.SHGFI_ADDOVERLAYS; } if ((options & FileIconOptions.DoNotAccessFile) == FileIconOptions.DoNotAccessFile) { flags |= NativeMethods.SHGFI_USEFILEATTRIBUTES; } return(flags); }
public static Icon GetFileIcon(string filePath, IconSize size = IconSize.Large, FileIconOptions options = 0, System.IO.FileAttributes attributes = System.IO.FileAttributes.Normal) { var flags = ToFileIconFlags(size, options); var sfi = new UnsafeNativeMethods.SHFILEINFO(); IntPtr sysImageList = UnsafeNativeMethods.SHGetFileInfo(filePath, attributes, ref sfi, UnsafeNativeMethods.SHFILEINFO.Sizeof(), flags); if (sysImageList == IntPtr.Zero) { throw new Win32Exception("SHGetFileIconInfo failed."); } if (sfi.hIcon == IntPtr.Zero) { throw new Win32Exception("SHGetFileIconInfo failed."); } return(HIconToIcon(sfi.hIcon)); }