FindFirstFile Не работает с Wild картами - PullRequest
2 голосов
/ 06 октября 2011

Я пытаюсь использовать функцию FindFirstFile, чтобы пройти через все мои .txt файлы, но я получаю ошибку INVALID_VALUE_HANDLE, когда я пытаюсь это сделать, вот моя функция:

int search(LPSTR lpszPath)
{
    WIN32_FIND_DATA WFD;
    HANDLE hSearch;
    CHAR szFilePath[MAX_PATH + 1];
    PathCombine(szFilePath, lpszPath, "*.txt");
    hSearch = FindFirstFile(szFilePath,&WFD);

    if(hSearch == INVALID_HANDLE_VALUE)
    {
        printf("Error Handle Value\n");
    }

    while (FindNextFile(hSearch,&WFD))
    {
        if(strcmp(WFD.cFileName,"..") && strcmp(WFD.cFileName,"."))
        {

            if(WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                PathCombine(szFilePath, lpszPath, WFD.cFileName);
                search(szFilePath);
            }
            else
            {
                PathCombine(szFilePath, lpszPath, WFD.cFileName);
                printf("%s\n",szFilePath);
        }
    }
}
 FindClose(hSearch);
 return 0;

Я думаю, что проблема связана с подстановочным знаком, какие-либо предложения?

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

Я предполагаю, что проблема в том, что при этом будут найдены только объекты, которые соответствуют *.txt. Вы хотите рекурсивный поиск по каталогам. Но он будет спускаться только в каталоги, которые соответствуют *.txt.

Для такого рекурсивного поиска вы должны перечислить все каталоги без подстановочного знака *.txt. Может быть проще сделать групповой тестирование самостоятельно.

Поэтому измените код на:

PathCombine(szFilePath, lpszPath, "*");

и проверьте каждый файл отдельно на расширение .txt.

Как уже отмечали другие, вы не можете проверить первый найденный файл. Вы должны переместить FindNextFile в конец цикла.

1 голос
/ 06 октября 2011

То есть вы вызываете FindFirstFile, и без обработки результата вы снова вызываете FindNextFile для следующего файла? Я уверен, что вы хотели этот первый результат тоже.

1 голос
/ 06 октября 2011

ИСПРАВЛЕНИЕ: извините, я использовал его только в версии Unicode.Так что Дэвид прав, он работает и с персонажами ANSI.В этом случае я предполагаю, что путь, который вы объединяете, недопустим.Возможно, вы не избежали обратной косой черты, например, "c: \ test \ *. Txt"

. Проблема не в подстановочных знаках, а в неправильном типе символов.Для того, чтобы что-то подобное, вам нужно использовать строки широких символов.

посмотрите на MSDN для примера

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