FindFirstFileW совпадение с подстановочными знаками - PullRequest
3 голосов
/ 12 апреля 2019

Рассмотрим отдельный пример, в котором я запрашиваю все имена в каталоге с подстановочным знаком:

#include <Windows.h>
#include <fstream>

void add_file(const std::string &path)
{
    std::ofstream  ofs(path,std::ofstream::out);
    ofs.close();
}

void foo(const std::wstring& szDir)
{
    std::cout << "f1 : FindFirstFileW\n";
    WIN32_FIND_DATAW ffd;
    HANDLE hFind = INVALID_HANDLE_VALUE;

    hFind = FindFirstFileW(szDir.c_str(), &ffd);

    if (INVALID_HANDLE_VALUE == hFind) 
    {
        std::cout << "Error in FindFirstFileW : " << GetLastError() << std::endl;
        return;
    } 

    // List all the files in the directory with some info about them.

    do
    {
        std::wcout <<"Long file name " << "  " <<  ffd.cFileName << std::endl;
        std::wcout <<"Short file name " << "  " <<  ffd.cAlternateFileName << std::endl;
    }
    while (FindNextFileW(hFind, &ffd) != 0);

    FindClose(hFind);
}

int main()
{
    const char  odd_filename[] = {static_cast<char>(0xC4U), '.', 't', 'x', 't', 0};

    add_file("C:\\mydir1\\777.Txt");
    add_file(std::string("C:\\mydir1\\") + std::string(odd_filename));

    foo(L"C:\\mydir1\\7*");

    return 0;
}

Это дает мне вывод, как показано ниже

f1 : FindFirstFileW
Long file name   777.Txt
Short file name
Long file name   ─.txt
Short file name   7F7E~1.TXT

Почему FindFirstFileW возвращает второе имя файла Ä.txt в качестве совпадения?

1 Ответ

5 голосов
/ 12 апреля 2019

Подстановочный знак применяется как к длинным, так и к коротким именам файлов. Второй файл имеет короткое имя 7F7E~1.TXT и соответствует 7*.

Документация описывает это так:

В следующем списке указаны некоторые другие характеристики поиска:

  • Поиск выполняется строго по имени файла, а не по каким-либо атрибутам, таким как дата или тип файла (другие параметры см. FindFirstFileEx).
  • Поиск включает в себя длинные и короткие имена файлов.
  • Попытка открыть поиск с обратной косой чертой всегда терпит неудачу.
  • Передача недопустимой строки, NULL или пустой строки для параметра lpFileName не является допустимым использованием этой функции. Результаты в этом случае не определены.

Второй пункт пули является подходящим.

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