Добрый вечер, помогите решить проблему я написал вот такой код. Код для загрузки иконок нашел в интернете и переделал его под свой проводник.
Код:
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;
[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 256)]
public string szDisplayName;
[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
[System.Runtime.InteropServices.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, System.Runtime.InteropServices.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, System.Runtime.InteropServices.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) { }
}
}
У меня возникла проблема, когда с самого начала я выбираю какой-то диск, подгружает все нормально, но потом, я так понял, берет самую последнею иконку и подставляет под все папки и файлы, не знаю как исправить. Заранее спасибо.