Как перебрать файлы в папке в VC ++ 6.0 - PullRequest
1 голос
/ 15 апреля 2019

Справочная информация:

В настоящее время я работаю над устаревшим приложением на VC ++ 6.Я пытаюсь создать функцию, которая перебирает все файлы в каталоге и получает все пути к файлам.

На своей собственной машине я использовал Visual Studio2017, и следующий код работает.Тем не менее, когда я реализую его на VC ++ 6, происходит сбой.

И когда я пытаюсь скомпилировать, отображаются в основном 2 типа ошибок

error C2664: 'FindFirstFileA' : cannot convert parameter 1 from 'const unsigned short *' to 'const char *'

error C2782: 'class std::basic_string<_E,_Tr,_A> __cdecl std::operator +(const class std::basic_string<_E,_Tr,_A> &,const _E)' : template parameter '_E' is ambiguous
        could be 'char *'

Любые идеи очень приветствуются.Спасибо

C ++ Код

#include <windows.h>
#include <string>
#include <vector>
#include <stack>
#include <iostream>

 using namespace std;

 bool ListFiles(wstring path, wstring mask,    vector<wstring>& files) {
HANDLE hFind = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA ffd;
wstring spec;
stack<wstring> directories;

directories.push(path);
files.clear();

while (!directories.empty()) {
    path = directories.top();
    spec = path + L"\\" + mask;
    directories.pop();

    hFind = FindFirstFile(spec.c_str(), &ffd);
    if (hFind == INVALID_HANDLE_VALUE)  {
        return false;
    } 

    do {
        if (wcscmp(ffd.cFileName, L".") != 0 && 
            wcscmp(ffd.cFileName, L"..") != 0) {
            if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                directories.push(path + L"\\" + ffd.cFileName);
            }
            else {
                files.push_back(path + L"\\" + ffd.cFileName);
            }
        }
    } while (FindNextFile(hFind, &ffd) != 0);

    if (GetLastError() != ERROR_NO_MORE_FILES) {
        FindClose(hFind);
        return false;
    }

    FindClose(hFind);
    hFind = INVALID_HANDLE_VALUE;
}

return true;
}

int main(int argc, char* argv[])
{
vector<wstring> files;

if (ListFiles(L"D:\\test", L"*", files)) {
    for (vector<wstring>::iterator it = files.begin   (); 
         it != files.end(); 
         ++it) {
        wcout << it->c_str() << endl;
    }
}
return 0;
}

1 Ответ

4 голосов
/ 15 апреля 2019

По умолчанию ваш проект настроен на использование узких (ANSI) системных функций.FindFirstFile переводится в FindFirstFileA и WIN32_FIND_DATA в WIN32_FIND_DATAA.

Вы можете перенастроить свой проект, определив UNICODE, _UNICODE и удалив _MBCS.

Меню Project -> Settings....

До:

_MBCS defined

После:

UNICODE and _UNICODE defined

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