Get a 32x32 icon for a given file : File Util « File Stream « C# / C Sharp






Get a 32x32 icon for a given file

   



//Microsoft Reciprocal License (Ms-RL)
//http://bmcommons.codeplex.com/license
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Text;

namespace BlueMirror.Commons
{

    public static class Win32
    {

        public const uint SHGFI_ICON = 0x100;
        public const uint SHGFI_DISPLAYNAME = 0x200;
        public const uint SHGFI_TYPENAME = 0x400;
        public const uint SHGFI_ATTRIBUTES = 0x800;
        public const uint SHGFI_ICONLOCATION = 0x1000;
        public const uint SHGFI_EXETYPE = 0x2000;
        public const uint SHGFI_SYSICONINDEX = 0x4000;
        public const uint SHGFI_LINKOVERLAY = 0x8000;
        public const uint SHGFI_SELECTED = 0x10000;
        public const uint SHGFI_LARGEICON = 0x0;
        public const uint SHGFI_SMALLICON = 0x1;
        public const uint SHGFI_OPENICON = 0x2;
        public const uint SHGFI_SHELLICONSIZE = 0x4;
        public const uint SHGFI_PIDL = 0x8;
        public const uint SHGFI_USEFILEATTRIBUTES = 0x10;

        private const uint FILE_ATTRIBUTE_NORMAL = 0x80;
        private const uint FILE_ATTRIBUTE_DIRECTORY = 0x10;

        [DllImport("comctl32.dll")]
        private static extern int ImageList_GetImageCount(int himl);

        [DllImport("comctl32.dll")]
        private static extern int ImageList_GetIcon(int HIMAGELIST, int ImgIndex, int hbmMask);

        [DllImport("shell32.dll")]
        private static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbfileInfo, uint uFlags);

        private struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public int dwAttributes;
            public string szDisplayName;
            public string szTypeName;
        }

        public enum FileIconSize
        {
            Small,    // 16x16 pixels
            Large    // 32x32 pixels
        }

        // get a 32x32 icon for a given file

        public static Image GetFileIconAsImage(string fullpath) {
            return GetFileIconAsImage(fullpath, FileIconSize.Large);
        }

        public static Image GetFileIconAsImage(string fullpath, FileIconSize size) {
            SHFILEINFO info = new SHFILEINFO();

            uint flags = SHGFI_USEFILEATTRIBUTES | SHGFI_ICON;
            if (size == FileIconSize.Small) {
                flags |= SHGFI_SMALLICON;
            }

            int retval = SHGetFileInfo(fullpath, FILE_ATTRIBUTE_NORMAL, ref info, System.Runtime.InteropServices.Marshal.SizeOf(info), flags);
            if (retval == 0) {
                return null;  // error occured
            }

            System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(info.hIcon);

            //ImageList imglist = new ImageList();
            //imglist.ImageSize = icon.Size;
            //imglist.Images.Add(icon);

            //Image image = imglist.Images[0];
            //icon.Dispose();
            //return image;
            return icon.ToBitmap();
        }

        public static Icon GetFileIcon(string fullpath, FileIconSize size) {
            SHFILEINFO info = new SHFILEINFO();

            uint flags = SHGFI_USEFILEATTRIBUTES | SHGFI_ICON;
            if (size == FileIconSize.Small) {
                flags |= SHGFI_SMALLICON;
            }

            int retval = SHGetFileInfo(fullpath, FILE_ATTRIBUTE_NORMAL, ref info, System.Runtime.InteropServices.Marshal.SizeOf(info), flags);
            if (retval == 0) {
                return null;  // error occured
            }

            System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(info.hIcon);
            return icon;
        }

        public static Icon GetFolderIcon(string fullPath, FileIconSize size) {
            SHFILEINFO info = new SHFILEINFO();

            uint flags = SHGFI_USEFILEATTRIBUTES | SHGFI_ICON;
            if (size == FileIconSize.Small) {
                flags |= SHGFI_SMALLICON;
            }

            int retval = SHGetFileInfo(fullPath, FILE_ATTRIBUTE_DIRECTORY, ref info, System.Runtime.InteropServices.Marshal.SizeOf(info), flags);
            if (retval == 0) {
                return null;  // error occured
            }

            System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(info.hIcon);
            return icon;
        }

        public static int GetFileIconIndex(string fullpath, FileIconSize size) {
            SHFILEINFO info = new SHFILEINFO();

            uint flags = SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX;
            if (size == FileIconSize.Small) {
                flags |= SHGFI_SMALLICON;
            }

            int retval = SHGetFileInfo(fullpath, FILE_ATTRIBUTE_NORMAL, ref info, System.Runtime.InteropServices.Marshal.SizeOf(info), flags);
            if (retval == 0) {
                return -1;  // error
            }

            return info.iIcon;
        }

        public static int GetFolderIconIndex(string fullpath, FileIconSize size) {
            SHFILEINFO info = new SHFILEINFO();

            uint flags = SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX;
            if (size == FileIconSize.Small) {
                flags |= SHGFI_SMALLICON;
            }

            int retval = SHGetFileInfo(fullpath, FILE_ATTRIBUTE_DIRECTORY, ref info, System.Runtime.InteropServices.Marshal.SizeOf(info), flags);
            if (retval == 0) {
                return -1;  // error
            }

            return info.iIcon;
        }

        public static void UpdateSystemImageList(ImageList imageList, FileIconSize size, bool isSelected, Image deletedImage) {
            SHFILEINFO info = new SHFILEINFO();
            uint flags = SHGFI_SYSICONINDEX;

            if (size == FileIconSize.Small)
                flags |= SHGFI_SMALLICON;

            if (isSelected == true)
                flags |= SHGFI_OPENICON;

            int imageHandle = SHGetFileInfo("C:\\", 0, ref info, System.Runtime.InteropServices.Marshal.SizeOf(info), flags);
            int iconCount = ImageList_GetImageCount(imageHandle);
            for (int i = imageList.Images.Count; i < iconCount; i++) {

                IntPtr iconHandle = (IntPtr)ImageList_GetIcon(imageHandle, i, 0);
                try {
                    if (iconHandle.ToInt64() != 0) {
                        Icon icon = Icon.FromHandle(iconHandle);
                        imageList.Images.Add(icon);
                        icon.Dispose();
                        DestroyIcon(iconHandle);
                    }
                }
                catch {
                    imageList.Images.Add(deletedImage);
                }
            }
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public extern static bool DestroyIcon(IntPtr handle);

        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public extern static int SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

        [DllImport("winmm.dll", EntryPoint = "mciSendStringA")]
        extern static void mciSendStringA(string lpstrCommand, string lpstrReturnString, long uReturnLength, long hwndCallback);

        public static void Eject(string driveLetter) {
            string returnString = "";
            mciSendStringA("set cdaudio!" + driveLetter + " door open", returnString, 0, 0);
        }

        public static void Close(string driveLetter) {
            string returnString = "";
            mciSendStringA("set cdaudio!" + driveLetter + " door closed", returnString, 0, 0);
        }

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public extern static uint RegisterWindowMessage(string lpString);

        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public extern static void SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public extern static int GetWindowLong(IntPtr hWnd, int nIndex);

        // Constants and structs defined in DBT.h

        public const int WM_DEVICECHANGE = 0x0219;
        public const int DBT_DEVICEARRIVAL = 0x8000;
        public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
        public const int DBT_DEVNODES_CHANGED = 0x0007;

        public enum DeviceType : int
        {
            OEM = 0x00000000,           //DBT_DEVTYP_OEM
            DeviceNode = 0x00000001,    //DBT_DEVTYP_DEVNODE
            Volume = 0x00000002,        //DBT_DEVTYP_VOLUME
            Port = 0x00000003,          //DBT_DEVTYP_PORT
            Net = 0x00000004            //DBT_DEVTYP_NET
        }

        public struct BroadcastHeader   //_DEV_BROADCAST_HDR 
        {
            public int Size;            //dbch_size
            public DeviceType Type;     //dbch_devicetype
            public int Reserved;       //dbch_reserved
        }

        public struct Volume            //_DEV_BROADCAST_VOLUME 
        {
            public int Size;            //dbcv_size
            public DeviceType Type;     //dbcv_devicetype
            public int Reserved;       //dbcv_reserved
            public int Mask;            //dbcv_unitmask
            public int Flags;           //dbcv_flags
        }

        [DllImport("kernel32.dll")]
        public extern static long GetVolumeInformation(string PathName, StringBuilder VolumeNameBuffer, int VolumeNameSize, ref uint VolumeSerialNumber, ref uint MaximumComponentLength, ref uint FileSystemFlags, StringBuilder FileSystemNameBuffer, int FileSystemNameSize);

        public static string GetVolumeSerialNumber(string drive) {
            uint serNum = 0;
            uint maxCompLen = 0;
            StringBuilder volLabel = new StringBuilder(256);
            uint volFlags = 0;
            StringBuilder fileSystemName = new StringBuilder(256);
            /* long ret = */ GetVolumeInformation(drive, volLabel, volLabel.Capacity, ref serNum, ref maxCompLen, ref volFlags, fileSystemName, fileSystemName.Capacity);

            string serialNumberAsString = serNum.ToString("X");
            serialNumberAsString.PadLeft(8, '0');
            serialNumberAsString = serialNumberAsString.Substring(0, 4) + "-" + serialNumberAsString.Substring(4);
            return serialNumberAsString;
        }

        // List View
        public const int LVS_EX_DOUBLEBUFFER = 0x10000;

        public const int LVM_FIRST = 0x1000;
        public const int LVM_SETITEMSTATE = LVM_FIRST + 43;
        public const int LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54;
        public const int LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55;
        public const int LVM_SETCOLUMNORDERARRAY = LVM_FIRST + 58;
        public const int LVM_GETCOLUMNORDERARRAY = LVM_FIRST + 59;

        public const int LVIF_STATE = 0x0008;
        public const int LVIS_SELECTED = 0x0002;
        public const int LVIS_FOCUSED = 0x0001; 

        [StructLayout(LayoutKind.Sequential)]
        public struct LVITEM
        {
            public uint mask;
            public int iItem;
            public int iSubItem;
            public uint state;
            public uint stateMask;
            public string pszText;
            public int cchTextMax;
            public int iImage;
            public int lParam;
            public int iIndent;
            public int iGroupId;
            public uint cColumns;
            public uint puColumns;
        }

        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
        public extern static int SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, ref LVITEM lvItem);

        // Tree View Styles
        public const int TV_FIRST = 0x1100;
        public const int TVM_SETEXTENDEDSTYLE = TV_FIRST + 44;
        public const int TVM_GETEXTENDEDSTYLE = TV_FIRST + 45;
        public const int TVM_SETAUTOSCROLLINFO = TV_FIRST + 59;

        public const int TVS_NOHSCROLL = 0x8000;
        public const int TVS_EX_MULTISELECT = 0x0002;
        public const int TVS_EX_DOUBLEBUFFER = 0x0004;
        public const int TVS_EX_AUTOHSCROLL = 0x0020;
        public const int TVS_EX_FADEINOUTEXPANDOS = 0x0040;
        public const int GWL_STYLE = -16;

        [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
        public extern static int SetWindowTheme(IntPtr hWnd, string pszSubAppName, string pszSubIdList);


        
    }

}

   
    
    
  








Related examples in the same category

1.Returns a human-readable version of the file size (original is in bytes).
2.Compares the content of 2 files
3.Copy file from source to destination
4.Clean a directory without deleting it
5.Implements the same behaviour as the "touch" utility on Unix.
6.Gets information about the files in a directory and puts it in an array of strings.
7.Checks if the giving File exists, and returns its length
8.Read the content of the text file.
9.Returns an array of abstract pathnames representing the files and directories of the specified path.
10.Get all the files that matches a wildcard pattern, eg. (*.tmp)
11.Tests if the specified file is newer than the reference file.
12.Returns true if the file specified by the pathname is a hidden file.
13.Checks if a file have write permissions
14.Remove a file or similar files if wildcard is included.
15.Sets the read-only property of the file to true.
16.Delete a file if exist
17.Get File SystemInfo
18.Saves a file
19.Renames a file
20.Determines if a directory exists
21.Deletes files newer than the specified date
22.Compares 2 files and determines if they are the same or not
23.Saves a file to an FTP server
24.Make file writable and copy
25.Create Temp File
26.Write File methods
27.Append File methods
28.Copy a file to a different filename, with cleaning null characters.
29.Read the given filename and yield return a string
30.Get Files / Get Folders methods
31.return true if the filename has the given attribute set
32.Copy from one file to another file
33.Create Thumbnail
34.removes invalid charactes from filenames, like the slash and backslash
35.Create Thumbnail Image
36.Removes invalid file name characters from the specified string.
37.Append a suffix (such as a date) to the name of the file.
38.Copy one folder to another folder
39.Checks if a given file exists
40.File size format
41.Format Byte in B, KB, MB, GB