Собственно, сабж. Необходимо считать заданный каталог и вывести в ListView, с иконками для каждого файла и папки.
Сделать, то я сделал, но тормозит очень. А большие папки (windows\system32) открываются вообще по 2-3 минуты

Как же это реализовано в эксплорере? Неужели заранее подгружены иконки для всех типов файлов?
Вот моя функция:
// Чтение каталога
// list - ListView
private void LoadDir()
{
IntPtr hImgLarge; //the handle to the system image list
SHFILEINFO shinfo = new SHFILEINFO();
SortedList<string, int> FileTypes = new SortedList<string, int>();
string path = "C:\\windows\\";
try
{
DirectoryInfo d = new DirectoryInfo(path);
list.Items.Clear();
try
{
DirectoryInfo[] ds = d.GetDirectories(); ;
foreach (DirectoryInfo s in ds) // Папки
{
list.Items.Add(s.Name, 0);
}
}
catch (Exception)
{ };
try
{
FileInfo[] fs = d.GetFiles();
// Очищаю ImageList, оставляю только две аостоянные иконки (папки)
while (list.LargeImageList.Images.Count > 2)
list.LargeImageList.Images.RemoveAt(list.LargeImageList.Images.Count - 1);
int index = list.LargeImageList.Images.Count - 1;
foreach (FileInfo s in fs) // Файлы
{
// Проверяем, обрабатывали ли мы такой файл
// Если да, то не нужно загружать его иконку
int im_index=1; // Стандартная иконка
try
{
im_index = FileTypes[s.Extension.ToLower()];
}
catch (Exeption)
{
try
{
//Сохраняем иконку в ImageList
hImgLarge = Win32.SHGetFileInfo(s.FullName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo),Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON);
list.LargeImageList.Images.Add(System.Drawing.Icon.FromHandle(shinfo.hIcon));
im_index = ++index;
// Добавляем расширение и номер иконки в коллекцию
if (s.Extension.ToLower() != ".exe")
FileTypes.Add(s.Extension.ToLower(), index);
}
catch (Exception)
{
}
}
// Добавляем элемент в ListView
list.Items.Add(s.Name,im_index);
}
}
catch
{ };
}
catch (Exception)
{
};
}
Но даже, если закоментить все, что относится к иконкам — просто выводить имена файлов\папок, все равно system32 выводится 2 секунды
Подскажите пожалуйста, как ускорить процесс...