Подстановочный знак FindFirstFileW

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

#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 как совпадение?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
741
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

документация охватывает это следующим образом:

The following list identifies some other search characteristics:

  • The search is performed strictly on the name of the file, not on any attributes such as a date or a file type (for other options, see FindFirstFileEx).
  • The search includes the long and short file names.
  • An attempt to open a search with a trailing backslash always fails.
  • Passing an invalid string, NULL, or empty string for the lpFileName parameter is not a valid use of this function. Results in this case are undefined.

Второй пункт списка относится к делу.

Помимо потраченного впустую места и времени в каталогах и при получении списка каталогов, эта проблема является еще одной причиной, по которой я всегда отключаю устаревшие короткие имена в NTFS. ReFS их даже не поддерживает. Код, основанный на их существовании, устарел.

Eryk Sun 12.04.2019 15:28

Рэймонд Чен также рассказал об этом в своем блоге: Почему FindFirstFile находит короткие имена?

Remy Lebeau 12.04.2019 18:49

действительно никогда не нужно использовать FindFirstFile, но как минимум FindFirstFileEx с FindExInfoBasic

RbMm 12.04.2019 19:28

Другие вопросы по теме