1

Тема: Listview підвантаження системних іконок

Добрий день, допоможіть вирішити проблему я написав ось такий код. Код для завантаження іконок знайшов в інтернеті і переробив його під свій провідник.

using System.Runtime.InteropServices;

public partial class Form1 : Form
{
    IntPtr hImgLarge;
    System.Drawing.Icon largeIcon;
    SHFILEINFO shinfo = new SHFILEINFO();
    public struct SHFILEINFO
    {
        public IntPtr hIcon;
        public int iIcon;
        public uint dwAttributes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string szDisplayName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
        public string szTypeName;
    };
    [DllImport("Shell32.dll")]
    private static extern IntPtr SHGetFileInfo(string pszPath,
        uint dwFileAttributes, ref SHFILEINFO psfi, int cbFileInfo, uint uFlags);

    public Form1()
    {
        InitializeComponent();
        GetDriveNodes();
    }
    private void GetDriveNodes()
    {
        try
        {
            foreach (string path in Environment.GetLogicalDrives())
                if (new DirectoryInfo(path).Exists)
                {
                    TreeNode driveNode = new TreeNode { Text = path };
                    FillTreeNode(driveNode, path);
                    treeView1.Nodes.Add(driveNode);
                }
        }
        catch (Exception) { }
    }

    void treeView1_GetFolders(object sender, TreeViewCancelEventArgs e)
    {
        try
        {
            foreach (var dir in Directory.GetDirectories(e.Node.FullPath))
            {
                TreeNode dirNode = new TreeNode(new DirectoryInfo(dir).Name);
                FillTreeNode(dirNode, dir);
                e.Node.Nodes.Add(dirNode);
            }
        }
        catch (Exception) { }
    }

    void treeView1_GetFiles(object sender, TreeViewCancelEventArgs e)
    {
        try
        {
            foreach (var dir in Directory.GetFiles(e.Node.FullPath))
            {
                TreeNode dirNode = new TreeNode(new DirectoryInfo(dir).Name);
                FillTreeNode(dirNode, dir);
                e.Node.Nodes.Add(dirNode);
            }
        }
        catch (Exception) { }
    }

    void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
    {
        e.Node.Nodes.Clear();
        treeView1_GetFolders(sender, e);
        treeView1_GetFiles(sender, e);
        GetItems(e.Node.FullPath);
    }

    private void FillTreeNode(TreeNode driveNode, string path)
    {
        try
        {
            foreach (string dir in Directory.GetFileSystemEntries(path))
            {
                TreeNode dirNode = new TreeNode();
                driveNode.Nodes.Add(dirNode);
            }
        }
        catch (Exception) { }
    }

    private void listView1_GetFolders(string[] folders, ImageList largeImageList)
    {
        try
        {
            foreach (string f in folders)
            {
                hImgLarge = SHGetFileInfo(f, 0, ref shinfo, Marshal.SizeOf(shinfo), 0x100 | 0x0);
                largeIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);

                string[] ss = f.Split(new char[] { '\\' });
                largeImageList.Images.Add(ss[ss.Length - 1], largeIcon);
                listView1.Items.Add(ss[ss.Length - 1], ss[ss.Length - 1]);
            }
        }
        catch (Exception) { }
    }

    private void listView1_GetFiles(string[] files, ImageList largeImageList)
    {
        try
        {
            foreach (string f in files)
            {
                hImgLarge = SHGetFileInfo(f, 0, ref shinfo, Marshal.SizeOf(shinfo), 0x100 | 0x0);
                largeIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);

                string[] ss = f.Split(new char[] { '\\' });
                largeImageList.Images.Add(ss[ss.Length - 1], largeIcon);
                listView1.Items.Add(ss[ss.Length - 1], ss[ss.Length - 1]);
            }
        }
        catch (Exception) { }
    }

    private void GetItems(string path)
    {
        try
        {
            if (Directory.Exists(path))
            {
                ImageList largeImageList = new ImageList();
                largeImageList.ColorDepth = ColorDepth.Depth32Bit;
                largeImageList.ImageSize = new System.Drawing.Size(32, 32);

                listView1.LargeImageList = largeImageList;
                listView1.Items.Clear();

                listView1_GetFolders(Directory.GetDirectories(path), largeImageList);
                listView1_GetFiles(Directory.GetFiles(path), largeImageList);
            }
        }
        catch (Exception) { }
    }
}

У мене виникла проблема, коли з самого початку я вибираю якийсь диск, підвантажує все нормально, але потім, я так зрозумів, бере останню іконку і підставляє під всі папки та файли, не знаю як виправити. Заздалегідь дякую за допомогу.