Esempio n. 1
0
        private static ImageSource GetFileIcon(string fileName)
        {
            // if file does not exist, create a temp file with the same file extension
            var isTemp = false;

            if (!File.Exists(fileName) && !Directory.Exists(fileName))
            {
                isTemp   = true;
                fileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + Path.GetExtension(fileName));
                File.WriteAllText(fileName, string.Empty);
            }
            var shinfo = new Natives.SHFILEINFO();
            var flags  = Natives.SHGFI_SYSICONINDEX;

            if (fileName.IndexOf(":", StringComparison.Ordinal) == -1)
            {
                flags = flags | Natives.SHGFI_USEFILEATTRIBUTES;
            }
            flags = flags | Natives.SHGFI_ICON | Natives.SHGFI_SMALLICON;
            Natives.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), flags);
            var icon    = Icon.FromHandle(shinfo.hIcon);
            var bitmap  = icon.ToBitmap();
            var hBitmap = bitmap.GetHbitmap();

            try
            {
                return(Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty,
                                                             BitmapSizeOptions.FromEmptyOptions()));
            }
            finally
            {
                Natives.DeleteObject(hBitmap);
                if (isTemp)
                {
                    File.Delete(fileName);
                }
            }
        }