
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.80] |
![]() |
|
Сообщ.
#1
,
|
|
|
Добрый день форумчане!
Есть функция, ищущая файлы в текущей папке. Ищем по расширениям .jpg и .bmp Для каждого запускается отдельный цикл FindFirst-FindNext. А как попроще, в одном цикле? ![]() ![]() HRESULT LoadSkins() { LPDIRECT3DTEXTURE9 *temp; SetCurrentDirectory(__argv[0]); WIN32_FIND_DATA fd={0}; const char mask[]="*.jpg"; HANDLE findhandle=FindFirstFile(mask,&fd); if(findhandle!=INVALID_HANDLE_VALUE) { do { temp=new LPDIRECT3DTEXTURE9; if(FAILED(D3DXCreateTextureFromFile(pDirect3DDevice,fd.cFileName ,temp))) return E_FAIL; textures.push_back(*temp); SkinsNumber++; } while(FindNextFile(findhandle,&fd)); } FindClose(findhandle); //-------------------for BMP const char mask2[]="*.bmp"; findhandle=FindFirstFile(mask2,&fd); if(findhandle!=INVALID_HANDLE_VALUE) { do { temp=new LPDIRECT3DTEXTURE9; if(FAILED(D3DXCreateTextureFromFile(pDirect3DDevice,fd.cFileName ,temp))) return E_FAIL; textures.push_back(*temp); SkinsNumber++; } while(FindNextFile(findhandle,&fd)); } FindClose(findhandle); return S_OK; } |
Сообщ.
#2
,
|
|
|
Поищите по маске "*.???" а затем просто дополнительно отсейте файлы не оканчивающиеся на .jpg или .bmp
ADD: Еще не стоит сразу применять найденные файлы. Сначала лучше составить из них список. Возможно вам понадобится еще дополнительно как-то их отсортировать или выбросить из списка некоторые элементы. |
Сообщ.
#3
,
|
|
|
Проще 2 раза поиск запустить.
|
Сообщ.
#4
,
|
|
|
Тогда решайте сами, что быстрее. Два раза выполнить обращения к диску для поиска по файловым записям или же один раз поискать все файла, которые подходят по общему шаблону и потом из результатов дополнительно отсеять не нужные. Как я вижу - работа со строками быстрее чем дважды искать на диске.
Надо понимать, что ФС ничего не знает о маске и перечисляет все файловые записи при каждом поиске, а уже заданная вами маска используется для первичного фильтра по условию. |
Сообщ.
#5
,
|
|
|
Т.Е. перебирать файлы подряд, проверяя имена на совпадение с критерием.
Думал, может хитрую маску какую можно скормить, типа как в консольных командах, навроде такой ![]() ![]() del *.jpg, *.jpeg, *.mp4 *.webp *.png *.pdf |
Сообщ.
#6
,
|
|
|
Цитата gorbovsky @ Думал, может хитрую маску какую можно скормить, типа как в консольных командах, навроде такой Это не хитрая маска, а список файлов где каждый член списка является маской и для каждого из списка запускается команда del. Это равнозначно последовательному поиску по маскам. Для команды cmd.exe это не критичная по скорости действия операция. В вашем же примере загружаются текстуры. Это само по себе не быстрая операция. А вы еще и диск загружаете повторными опросами. Разумнее в плане стратегии использования кеша диска использовать маску '*' или общую для ваших двух случаев '*.???'. Дальше сделать свой фильтр записей, чтобы обращения для поиска по папке прошли все разом подряд и только один раз *. Ну а дальше начнутся уже обращения на чтение с диска для загрузки текстур. Они уже могут по своему использовать кеш работы с диском. Да и сам процесс загрузки и создания текстур можно потом будет распараллелить на несколько потоков. Потому, как вы вскоре выясните, само время чтения файла текстуры с диска много меньше чем преобразование считанного в преемлимый для текстуры формат (bmp - для файлов jpg в вашем случае). Как показывают результаты тестирования библиотек загрузки jpg и png: чтение с диска для 650 Мб данных на нем (т.е. размер исходных файлов общим числом ок 1000) составляет примерно 1 сек для SATA 3 обычного HDD (WD 7200 об/сек - т.е. присутствуют задержки на доступ к секторам и все равно время маленькое; для SSD и тем более M2 время будет еще меньше). А вот общее время загрузки и преобразования уже составляет 10 сек для 20 потоков и 15 сек для 1 потока. Тогда как дополнительное преобразование (создание миниатюры из bmp) добавляет к этому времени еще 5 сек. ADD: * - это нужно для оптимизации работы ОС с диском и самого устройства. Хотя я говорю дальше, что чтение весьма быстрая операция, но операции сбора строк путей к файлам - это операции чисто с оперативной памятью и они еще быстрее чем обращения к диску. |
Сообщ.
#7
,
|
|
|
Если хост система Windows то в API функциях есть поддержка выборки файлов по маскам где выбрать можно несколько, важно указать разделитель, от системы к системе он различается но в основном точка с запятой вот пример маски как при выборе файлов
".JPG;.BMP;.MOV" есть случаи когда требуется указания названий "*.jpg;*.bpm;*.mov" |
Сообщ.
#8
,
|
|
|
Цитата konvikkor @ Если хост система Windows то в API функциях есть поддержка выборки файлов по маскам где выбрать можно несколько, важно указать разделитель, от системы к системе он различается но в основном точка с запятой вот пример маски как при выборе файлов ".JPG;.BMP;.MOV" есть случаи когда требуется указания названий "*.jpg;*.bpm;*.mov" Я понимаю, что ChatGPT популярен. Но вот хотя бы изредка стоит заглядывать в описания API У comapi в шаблонах диалоговых окон может быть задано несколько масок. Но этот фильтр выполняет сама comapi. В описании функции же FindFirstFile про маски все четко и ясно сказано. Маска может быть только одна, но в ней могут присутствовать * и ? для выполнения выбора группы файлов. Если надо искать по нескольким маскам, то вам придется либо составить общую маску и выбросить все не подходящие вам результаты поиска, либо запускать поиск несколько раз. |