Рекурсивный поиск файлов по маске во всех директориях и папках С++

204
14 мая 2018, 13:10

Короче, проблема в том, что не получается попадать в другие диски и папки(выше чем лежит исполняемый файл).
И вообще сильное ощущение, что написана функция очень криво и не правильно. Подскажите как бы ее переписать корректно

bool Search_File(TCHAR *buffer, char mas[])
{
HANDLE file;
WIN32_FIND_DATA ffd = {0};
TCHAR temp[MAX_PATH];
TCHAR str[MAX_PATH];
SetCurrentDirectory(buffer);//текуций католог 
file = FindFirstFile(TEXT(mas),&ffd);

if (file == INVALID_HANDLE_VALUE) {
    cout <<"Файл не был найден"<<endl;
    return false;
}
else{
    do{
        if(!strcmp(ffd.cFileName, TEXT("."))||!strcmp(ffd.cFileName, 
TEXT(".."))){
            continue;
        }   
        if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){//если не 
установлен бит, тогда файл
            strcpy(temp, buffer);
            strcat(temp, "\\");
            strcat(temp, ffd.cFileName);
            Search_File(buffer, mas);
            strcpy(buffer, temp);
            continue;
        }
        cout<<"найденый файл:"<<ffd.cFileName<<endl;
    }
    while(FindNextFile(file,&ffd) != 0);    
}
FindClose(file);
return true;    
}
Answer 1

Обратите внимание на следующие моменты:

Во-первых, неправильно используется функция SetCurrentDirectory(), что чревато дальнейшими ошибками по мере роста кода программы. Дело в том, что текущий каталог - это глобальная переменная процесса и изменять ее таким образом, в одной из рабочих функций, и тем более - не восстанавливать - некорректная практика. Если имеем дело с многопоточным приложением и в разных потоках используются файловые операции (а как правило в больших программах именно так и происходит - ведутся протоколы, логи, багрепорты, считываются/записываются опции и т.п.), то хаотичное изменение текущего каталога недопустимо. Если эта функция используется, то обычно в момент инициализации программы при запуске и большинство (если не все) файловых операций осуществляются по относительным путям (относительно текущего).

Поэтому рекомендую убрать из функции вызов SetCurrentDirectory() и передавать на вход функции Search_File() полный путь + маска искомого файла (помним, что в FindFirstFile() можно использовать символы * и ?) или образовывать этот полный путь динамически путем присоединения внутри функции mas[] к buffer.

Во-вторых, в определенных случаях (когда целевое имя содержит подстановочные символы, точку или имя каталога) необходимо иметь права доступа к корневому каталогу и ко всем подкаталогам в поисковом пути для успешного поиска.

READ ALSO
задача про stack

задача про stack

Дана шеренга из n психовКаждому психу дан идентификатор от 1 до n На каждом ходе каждый псих, имеющий идентификатор больше, чем у психа справа...

162
Обратная польская запись - C++

Обратная польская запись - C++

Как и куда записать строку, которая будет парситься?

235
Как правильно сделать такой эффект в пагинации?

Как правильно сделать такой эффект в пагинации?

Как сделать такую анимацию пагинации перемещения точек элементов между числами 01, 02 , 03 , 04 ?

276
перестает работать ссылка(css)

перестает работать ссылка(css)

Есть блок, вот его код

221