private static BitmapSource GetIconPathForDirectory(FileSystemInfo directoryInfo) { if (directoryInfo.Attributes == FileAttributes.Directory && IconPathCache.ContainsKey("")) { return(IconPathCache[""]); } Spi.Win32.SHFILEINFO shinfo = new Spi.Win32.SHFILEINFO(); try { Spi.Win32.SHGetFileInfo(directoryInfo.FullName, 0, out shinfo, (uint)Marshal.SizeOf(typeof(Spi.Win32.SHFILEINFO)), Spi.Win32.SHGFI_ICON | Spi.Win32.SHGFI_SMALLICON); if (shinfo.hIcon == IntPtr.Zero) { return(null); } using var icon = System.Drawing.Icon.FromHandle(shinfo.hIcon); var iconSource = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); if (directoryInfo.Attributes == FileAttributes.Directory) { IconPathCache.Add("", iconSource); } return(iconSource); } finally { Spi.Win32.DestroyIcon(shinfo.hIcon); } }
private static BitmapSource GetIconPath(FileSystemInfo fileSystemInfo) { if (fileSystemInfo == null) { return(null); } if (fileSystemInfo.Attributes.HasFlag(FileAttributes.Directory)) { return(GetIconPathForDirectory(fileSystemInfo)); } var extension = Path.GetExtension(fileSystemInfo.Name); if (IconPathCache.TryGetValue(extension, out var result)) { return(result); } else { Spi.Win32.SHFILEINFO shinfo = new Spi.Win32.SHFILEINFO(); try { Spi.Win32.SHGetFileInfo($"x{extension}", 0, out shinfo, (uint)Marshal.SizeOf(typeof(Spi.Win32.SHFILEINFO)), Spi.Win32.SHGFI_ICON | Spi.Win32.SHGFI_SMALLICON | Spi.Win32.SHGFI_USEFILEATTRIBUTES); if (shinfo.hIcon == IntPtr.Zero) { return(null); } using var icon = System.Drawing.Icon.FromHandle(shinfo.hIcon); var iconSource = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); IconPathCache.Add(extension, iconSource); return(iconSource); } finally { Spi.Win32.DestroyIcon(shinfo.hIcon); } } }