Сбой _findnext64 с нарушением прав доступа - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь получить все файлы с определенным расширением, например "right_*.jpg". Каким-то образом этот код завис во время выполнения с "access violation". Это для сборки x64.

int GetDir64(const char *dir, const char *str_wildcard, std::vector<std::string> &files)
    {
        char pathstr[500];
        struct  __finddata64_t  c_file;
        long hFile;
        sprintf(pathstr, "%s\\%s", dir, str_wildcard); 
        printf("GetDir(): %s\n", pathstr);

        if ((hFile = _findfirst64(pathstr, &c_file)) != -1L)
        {
            do
            {
                std::string fn_str = std::string(c_file.name);
                files.push_back(fn_str);
            } while (_findnext64(hFile, &c_file) == 0); // this is where the crash happened 
            _findclose(hFile);
        }
        return 0;
    }

1 Ответ

0 голосов
/ 24 января 2019

Все _findfirst функции задокументированы как возвращающие intptr_t.Если у вас 64-битная сборка, intptr_t имеет ширину 64 бита.Вы сохраняете результат в long - который имеет ширину всего 32 бита, таким образом, обрезая возвращаемый дескриптор.

Если бы вы написали код как:

       const auto hFile = _findfirst64(pathstr, &c_file);
       if (hFile != -1)

, тогда это не имело быбыла проблема.

(я бы также построил pathstr как std::string и использовал бы .c_str() для получения указателя. Я ненавижу массивы фиксированного размера.)

...