1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
1

Быстрое извлечение иконок для файлов в папке

09.12.2012, 10:51. Показов 1119. Ответов 8
Метки нет (Все метки)

Здравстуйте, занимаюсь написанием файлового менеджера, возникла следующая проблема — извлечение иконок происходит очень уж медленно, подскажите как ускорить этот процесс.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void TMainForm::AddFiles(UnicodeString DirPath, UnicodeString FileMask)
{ int i=0;
  TSearchRec sr;
  int res;
  TPath tpath;
  TDateTime DateTime;
  UnicodeString AttrStr;
  SHFILEINFO shFileInfo;
  memset(&shFileInfo,0,sizeof(shFileInfo));
  UnicodeString FullPath;
 
  ListView->Items->BeginUpdate();
  ListView->Items->Clear();
  res=FindFirst(DirPath+FileMask,Attributes,sr);
  if (res==0)
  { do
    { if (sr.Name==".") { continue; }
      ListView->Items->Add();
      if ((sr.Attr & faDirectory) == 0) // this is file
      { FullPath=DirPath+sr.Name;
                SHGetFileInfo(FullPath.t_str(), 0, &shFileInfo,
                 sizeof(shFileInfo), SHGFI_SMALLICON | SHGFI_SYSICONINDEX);
               ListView->Items->Item[i]->ImageIndex=shFileInfo.iIcon;
             }
      else // this is dir
      { ListView->Items->Item[i]->Caption=sr.Name;
                if (sr.Name=="..") { ListView->Items->Item[i]->ImageIndex=5; }
                    else { ListView->Items->Item[i]->ImageIndex=1; }
          } // if file or dir
     } while (FindNext(sr)==0);
    FindClose(sr);
  }//if dir not empty
  ListView->Items->EndUpdate();
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void __fastcall TMainForm::FormCreate(TObject *Sender)
{ SHFILEINFO shFileInfo;
  memset(&shFileInfo,0,sizeof(shFileInfo));
  LargeIconList->Handle=0;
  SmallIconList->Handle=0;
  UnicodeString UtoW="";
 
  Dir="d:\\temp\\";
  Mask="*.*";
  Attributes = faAnyFile;
 
  LargeIconList->Handle=SHGetFileInfo(UtoW.t_str(),0,&shFileInfo,sizeof(shFileInfo),
             SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
  if (LargeIconList->Handle==NULL)
  { ShowMessage("Big icons are not available");
     exit(-1);
  }
 
  SmallIconList->Handle=SHGetFileInfo(UtoW.t_str(),0,&shFileInfo,sizeof(shFileInfo),
             SHGFI_SYSICONINDEX | SHGFI_SMALLICON;
  if (SmallIconList->Handle==NULL)
  { ShowMessage("Small icons are not available");
     exit(-1);
  }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2012, 10:51
Ответы с готовыми решениями:

Быстрое извлечение файлов - MySQL PHP HTML
Добрый вечер! Заинтересовал один вопрос: Данные (т.е. картинки) берутся из папок, которые...

Извлечение иконок для иконочного шрифта
Может, не самое правильное место для такого вопроса, но в ветке по Microsoft Office вряд ли кто...

Извлечение иконок из файла
Перекопал интернет, не нашел вообще ни одного рабочего примера. Видел все возможные граберы иконок...

Извлечение иконок из shell32.dll
У кого нибудь есть Api функция для извлечения иконок из shell32.dll И их вставка в ToolBar?

8
Эксперт С++
8378 / 6139 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.12.2012, 04:44 2
Попробуй с помощью ExtractAssociatedIcon() я делал через неё. Для не большего количества файлов вроде нормально. Но если файлов много...

В общем я решал эту проблему многопоточностью, главное грузил в основном потоке остальное подгружал в "теневом" потоке https://www.cyberforum.ru/blog... og621.html

Но на данный момент думаю для своей программы стоит сохранять и хранить иконки в отдельном файле, по тому как собирать их по всей файловой системе думаю накладно...

http://msdn.microsoft.com/ru-r... 85%29.aspx
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
10.12.2012, 10:40  [ТС] 3
Спасибо за ответ, но можно поподробнее? Я пытался использовать ExtractAssociatedIcon, но она возвращает HICON, я понятия не имею как заставить TListView её отобразить, ведь он воспринимает только индекс, который при вызове данной функции всегда 1 (значение третьего аргумента). Насчёт многопоточности, имеется ввиду вывести все файлы, а затем для них искать иконки?
0
Эксперт С++
8378 / 6139 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.12.2012, 22:40 4
но она возвращает HICON
Ну так объект TIcon
C++
1
Icon->Handle =  ExtractAssociatedIcon( /*...*/ );
А затем его в ImageList, хотя стоит заметить что ImageList сам по себе медленный компонент, но думаю можно как-то напрямую загружать иконки в TListView, например из std::vector<TIcon*>

Если посмотреть в исходники моей программы я создал класс TLink для этого и использовал std::vector<TLink>

имеется ввиду вывести все файлы, а затем для них искать иконки?
Тут зависит от постановки задачи.

К примеру в моей программе несколько закладок, текущая открытая закладка грузится в основном потоке - остальные во вторичном.
0
1 / 1 / 0
Регистрация: 04.09.2011
Сообщений: 40
11.12.2012, 01:38  [ТС] 5
Спасибо ещё раз попробую, что-то такое провернуть.
0
LK
Заблокирован
11.12.2012, 12:11 6
все давно украдено до нас...
Вопрос по компоненту ListView
0
4039 / 2329 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
11.12.2012, 12:58 7
LK, дык, там в точности такая же схема, как у ТС.
0
LK
Заблокирован
11.12.2012, 15:43 8
BRcr, но там, я так понял, работает.
0
Эксперт С++
8378 / 6139 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.12.2012, 18:00 9
Цитата Сообщение от LK Посмотреть сообщение
BRcr, но там, я так понял, работает.
Таки тут работает, но не так как хотелось бы...
Цитата Сообщение от VaeVictis Посмотреть сообщение
извлечение иконок происходит очень уж медленно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2012, 18:00
Помогаю со студенческими работами здесь

Циклический запуск программы для файлов в папке, имена файлов в виде параметров для программы
Имеется задача - с помощью bat файла циклически запускать программу convert.exe для всех файлов в...

Скрипт для анализа файлов в папке
Приветствую! Друзья, подскажите, есть какой-нибудь апплет или функция для работы с файлами?...

ПО для автоматического переименования файлов в папке?
Кто может подсказать название ПО для автоматического переименования файлов папке? К примеру в...

Foreach для считывания файлов по циклу в папке
я использую foreach для считывания файлов по циклу в папке. вот в чем проблема после первого файла...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru