2

I was required in one of my projects to get the icon for specific folders from their paths.

For example:
If I use C:\Users\Username\Desktop I want to get the icon associated with the Desktop folder
If I use the path of a folder that has a custom icon, I want to get that icon

AND NO, I DO NOT WANT THE GENERAL DEFAULT FOLDER ICON

I've been searching for nearly 3 days with no luck. Any help is appreciated.

Dmitry
  • 13,797
  • 6
  • 32
  • 48
vbtheory
  • 373
  • 3
  • 17
  • 1
    Dirty way is to just grab it from desktop.ini, but since it is obvious (as it is jst file in the folder) I assume you are looking for something else... Here are existing questions of the same type: http://stackoverflow.com/questions/tagged/desktop.ini (not sure what you've spent 3 days on). And this [Get folder type](http://stackoverflow.com/questions/17158300/how-to-get-set-folder-type-in-c-sharp) is likely contains all info you need to start writing your solution. – Alexei Levenkov May 14 '14 at 22:26

1 Answers1

6

You could use the native SHGetFileInfo function. You can import it using the .net InteropServices.

There's a knowledge base article describing how to do it.

http://support.microsoft.com/kb/319350

EDIT:

Also

How do I fetch the folder icon on Windows 7 using Shell32.SHGetFileInfo

Example:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace IconTest2
{
    public partial class MainWindow : Window
    {
        //Struct used by SHGetFileInfo function
        [StructLayout(LayoutKind.Sequential)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };

        //Constants flags for SHGetFileInfo 
        public const uint SHGFI_ICON = 0x100;
      public const uint SHGFI_LARGEICON = 0x0; // 'Large icon

        //Import SHGetFileInfo function
     [DllImport("shell32.dll")]
     public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

            public MainWindow()
            {
                InitializeComponent();
                SHFILEINFO shinfo = new SHFILEINFO();

                //Call function with the path to the folder you want the icon for
                SHGetFileInfo(
                    "C:\\Users\\Public\\Music",
                    0, ref shinfo,(uint)Marshal.SizeOf(shinfo),
                    SHGFI_ICON | SHGFI_LARGEICON);

                using (Icon i = System.Drawing.Icon.FromHandle(shinfo.hIcon))
                {
                    //Convert icon to a Bitmap source
                    ImageSource img = Imaging.CreateBitmapSourceFromHIcon(
                                            i.Handle,
                                            new Int32Rect(0, 0, i.Width, i.Height),
                                            BitmapSizeOptions.FromEmptyOptions());

                    //WPF Image control
                    m_image.Source = img;
                }
            }
        }
    }

Reference for SHGetFileInfo - http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179(v=vs.85).aspx

Community
  • 1
  • 1
Wearwolf
  • 170
  • 8