Как быстро прочитать содержимое каталога
От: ProtecT  
Дата: 03.06.06 12:43
Оценка:
Собственно, сабж. Необходимо считать заданный каталог и вывести в 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 секунды

Подскажите пожалуйста, как ускорить процесс...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.