Поиск в каталоге с подстановочными знаками Windows 10 C с помощью API FindFirstFile не работает

Это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <windows.h>
void filesearch(char* path,char* fname);


int main()
{
    filesearch("C:\\Users\\Admin Local\\Documents","test.txt");
    int choice;
    char folder[80],fname[80];
    printf("\nWhich directory will I search in?    ");
    gets(folder);
    printf("\nWhat is the filename of the required file?     ");
    gets(fname);
    filesearch(folder,fname);
}

void filesearch(char* folder,char* fname){
    char path[80];
    HANDLE filehandle;
    WIN32_FIND_DATA ffd;


    strcpy(path,folder);
    strcat(path,"\\*");
   // printf("%s\n",path);

    filehandle=FindFirstFile(path,&ffd);

    do{
        if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
            if(strcmp(ffd.cFileName,".")==0){
                FindNextFile(filehandle,&ffd);
                continue;
            }
            char subpath[80];
            strcpy(subpath,folder);
            strcat(subpath,"\\");
            strcat(subpath,ffd.cFileName);
            filesearch(subpath,fname);
            continue;
        }
        if(strcmp(ffd.cFileName,fname)==0)
            printf("\n%s\\%s\n",folder,ffd.cFileName);
    }while(FindNextFile(filehandle,&ffd)!=0);
    FindClose(filehandle);
    return;
}

Когда я помещаю каталог, например: C:\Users\Admin Local\Documents и подстановочный знак *.txt, ничего не происходит. Программа внезапно останавливается, и окна показывают ошибку и завершают работу.

Тем не менее, когда я помещаю: C:\Users\Admin Local\Documents и имя файла test.txt, он выводит, как и должно.

У меня есть тестовый вызов функции в строке 10, чтобы я мог проверить, правильно ли она работает, не беспокоясь о пользовательском вводе и ошибках при обработке ввода.

тестовый звонок работает нормально.

Есть ли проблема в коде или это проблема антивируса и самое главное, как мне это исправить?


person debanshu das    schedule 05.10.2020    source источник
comment
strcmp не распознает подстановочные знаки.   -  person MikeCAT    schedule 05.10.2020
comment
Не проверял, не пойдет ли эта программа C:\Users\Admin Local\Documents\..\..\..\..\..\..\..\..\.. и так далее?   -  person MikeCAT    schedule 05.10.2020
comment
@MikeCAT На самом деле нет, либо по счастливой случайности, либо по (рискованному) трюку. Когда встречается ".", код выполняет две FindNextFile итерации подряд, что приводит к пропуску "..".   -  person dxiv    schedule 05.10.2020


Ответы (1)


Первая проблема заключается в том, что все эти 80-символьные буферы слишком малы для безопасного поиска. Их следует заменить как минимум на char folder[_MAX_PATH] и т.п. Тогда основная проблема заключается в следующем:

    if(strcmp(ffd.cFileName,fname)==0)
        printf("\n%s\\%s\n",folder,ffd.cFileName);

Это сравнивает имя файла с подстановочным знаком и не работает для настоящих подстановочных знаков. Скорее должно быть:

    if(PathMatchSpec(ffd.cFileName,fname))
        /* ... */

Использование PathMatchSpec требует #include <shlwapi.h> и связывания до shlwapi.lib.

person dxiv    schedule 05.10.2020
comment
Я получил shlwapi.h, но не могу найти shlwapi.lib. Где его можно найти в codeblocks mingw версии 20.03? - person debanshu das; 06.10.2020
comment
@debanshudas Вы можете обратиться к этой теме. - person Song Zhu; 06.10.2020
comment
Привет, если этот ответ помог вам, пожалуйста, отметьте его, чтобы помочь людям с такой же проблемой. - person Song Zhu; 07.10.2020