Подстановочные знаки и перечисление IShellFolder? - PullRequest
1 голос
/ 11 июня 2019

Я хотел попробовать отойти от FindFirstFile() / FindNextFile() и работать напрямую с IShellFolder, чтобы получить список файлов.Причина в том, что я хочу получить IShellItem через SHNCreateItemFromIDList() для каждого файла, и у меня будет все необходимое для передачи в функцию.Если бы я использовал функции путей к файлам, я думаю, что мне нужно будет каждый раз создавать полный путь перед переходом на SHCreateItemFromParsingName(), но я задам еще один вопрос, специфичный для этого.

Мой вопрос здесь ограничен использованием IShellFolder для перечисления файлов и папок с использованием подстановочных знаков.Есть ли что-то встроенное, чтобы сделать это, или вы должны сделать свой собственный файл соответствия?

TIA !!

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Вы не можете использовать IShellFolder для фильтрации, но вы можете использовать средства поиска, встроенные в оболочку, чтобы делать то же самое программно, как если бы вы использовали пользовательский интерфейс Windows Explorer.

Например, выможно ввести что-то вроде ext: .txt в поле поиска в правом углу, это означает, что вы хотите отфильтровать все файлы с расширением .txt :

enter image description here

Это пример кода C ++, в некоторой степени эквивалентный (я удалил проверки ошибок в каждой строке, но не забудьте проверить все возможные ошибки):

int main()
{
  CoInitialize(NULL);
  {
    CComPtr<ISearchFolderItemFactory> search;
    CComPtr<IShellItem> item;
    CComPtr<IShellItemArray> items;
    CComPtr<IQueryParserManager> mgr;
    CComPtr<IQueryParser> parser;
    CComPtr<IQuerySolution> solution;
    CComPtr<ICondition> condition;
    CComPtr<IShellItem> searchItem;
    CComPtr<IEnumShellItems> enumItems;

    // create search folder factory
    search.CoCreateInstance(CLSID_SearchFolderItemFactory);

    // create d:\temp shell item and set search folder scope to it
    SHCreateItemFromParsingName(L"d:\\temp", NULL, IID_PPV_ARGS(&item));
    SHCreateShellItemArrayFromShellItem(item, IID_PPV_ARGS(&items));
    search->SetScope(items);

    // create the query parser manager
    mgr.CoCreateInstance(CLSID_QueryParserManager);
    mgr->CreateLoadedParser(L"", 0, IID_PPV_ARGS(&parser));

    // parse an ms-search expression
    parser->Parse(L"ext:.txt", NULL, &solution);

    // get the condition the parser has built for us
    solution->GetQuery(&condition, NULL);

    // give the condition to the search folder factory
    search->SetCondition(condition);

    // get the search result back as a shell item (a virtual folder) and enumerates it
    search->GetShellItem(IID_PPV_ARGS(&searchItem));
    searchItem->BindToHandler(NULL, BHID_EnumItems, IID_PPV_ARGS(&enumItems));

    do
    {
      CComPtr<IShellItem> child;
      ULONG fetched;
      HRESULT hr2 = enumItems->Next(1, &child, &fetched);
      if (!fetched)
        break;

      // get the display name (for example)
      CComHeapPtr<WCHAR> name;
      child->GetDisplayName(SIGDN_NORMALDISPLAY, &name);
      wprintf(L"item: %s\n", name);

      CComHeapPtr<WCHAR> path;
      child->GetDisplayName(SIGDN_FILESYSPATH, &path);
      wprintf(L" path: %s\n", path);
    } while (TRUE);
  }
  CoUninitialize();
  return 0;
}

Язык search-ms довольно мощный.Его синтаксис доступен здесь: Запрос индекса с протоколом search-ms

0 голосов
/ 11 июня 2019

API оболочки обеспечивает перечисление, но без каких-либо средств фильтрации или подстановочных знаков, схожих с FindFirstFile() / FindNextFile().

Поэтому при использовании функции перечисления оболочки необходимо фильтровать элементы вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...