Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }