На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Поиск файлов в папке по двум маскам.
    Добрый день форумчане!
    Есть функция, ищущая файлы в текущей папке.
    Ищем по расширениям .jpg и .bmp
    Для каждого запускается отдельный цикл FindFirst-FindNext.
    А как попроще, в одном цикле?
    ExpandedWrap disabled
      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;
      }
      Поищите по маске "*.???" а затем просто дополнительно отсейте файлы не оканчивающиеся на .jpg или .bmp

      ADD: Еще не стоит сразу применять найденные файлы. Сначала лучше составить из них список. Возможно вам понадобится еще дополнительно как-то их отсортировать или выбросить из списка некоторые элементы.
      Сообщение отредактировано: macomics -
        Проще 2 раза поиск запустить.
          Тогда решайте сами, что быстрее. Два раза выполнить обращения к диску для поиска по файловым записям или же один раз поискать все файла, которые подходят по общему шаблону и потом из результатов дополнительно отсеять не нужные. Как я вижу - работа со строками быстрее чем дважды искать на диске.

          Надо понимать, что ФС ничего не знает о маске и перечисляет все файловые записи при каждом поиске, а уже заданная вами маска используется для первичного фильтра по условию.
          Сообщение отредактировано: macomics -
            Т.Е. перебирать файлы подряд, проверяя имена на совпадение с критерием.
            Думал, может хитрую маску какую можно скормить, типа как в консольных командах, навроде такой
            ExpandedWrap disabled
              del *.jpg, *.jpeg, *.mp4 *.webp *.png *.pdf
              Цитата 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: * - это нужно для оптимизации работы ОС с диском и самого устройства. Хотя я говорю дальше, что чтение весьма быстрая операция, но операции сбора строк путей к файлам - это операции чисто с оперативной памятью и они еще быстрее чем обращения к диску.
              Сообщение отредактировано: macomics -
                Если хост система Windows то в API функциях есть поддержка выборки файлов по маскам где выбрать можно несколько, важно указать разделитель, от системы к системе он различается но в основном точка с запятой вот пример маски как при выборе файлов
                ".JPG;.BMP;.MOV" есть случаи когда требуется указания названий "*.jpg;*.bpm;*.mov"
                  Цитата konvikkor @
                  Если хост система Windows то в API функциях есть поддержка выборки файлов по маскам где выбрать можно несколько, важно указать разделитель, от системы к системе он различается но в основном точка с запятой вот пример маски как при выборе файлов
                  ".JPG;.BMP;.MOV" есть случаи когда требуется указания названий "*.jpg;*.bpm;*.mov"

                  Я понимаю, что ChatGPT популярен. Но вот хотя бы изредка стоит заглядывать в описания API

                  У comapi в шаблонах диалоговых окон может быть задано несколько масок. Но этот фильтр выполняет сама comapi.

                  В описании функции же FindFirstFile про маски все четко и ясно сказано. Маска может быть только одна, но в ней могут присутствовать * и ? для выполнения выбора группы файлов. Если надо искать по нескольким маскам, то вам придется либо составить общую маску и выбросить все не подходящие вам результаты поиска, либо запускать поиск несколько раз.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0319 ]   [ 16 queries used ]   [ Generated: 17.05.25, 20:53 GMT ]