C++ _findfirst и TCHAR

Мне дали следующий код:

int _tmain(int argc, _TCHAR* argv[]) {
    _finddata_t dirEntry;
    intptr_t dirHandle;
    dirHandle = _findfirst("C:/*", &dirEntry);
    int res = (int)dirHandle;
    while(res != -1) {
        cout << dirEntry.name << endl;
        res = _findnext(dirHandle, &dirEntry);
    }
    _findclose(dirHandle);
    cin.get();
   return (0);
}

то, что это делает, печатает имя всего, что содержит данный каталог (C:). Теперь я должен распечатать название всех подкаталогов (если они есть). Я получил это до сих пор:

int _tmain(int argc, _TCHAR* argv[]) {
    _finddata_t dirEntry;
    intptr_t dirHandle;
    dirHandle = _findfirst(argv[1], &dirEntry);
    vector<string> dirArray;
    int res = (int)dirHandle;
    unsigned int attribT;
    while (res != -1) {
        cout << dirEntry.name << endl;
        res = _findnext(dirHandle, &dirEntry);
        attribT = (dirEntry.attrib >> 4) & 1; //put the fifth bit into a temporary variable
//the fifth bit of attrib says if the current object that the _finddata instance contains is a folder.
        if (attribT) { //if it is indeed a folder, continue (has been tested and confirmed already)
            dirArray.push_back(dirEntry.name);
            cout << "Pass" << endl;
            //res = _findfirst(dirEntry.name, &dirEntry); //needs to get a variable which is the dirEntry.name combined with the directory specified in argv[1].
    }
}
_findclose(dirHandle);
std::cin.get();
return (0);

}

Сейчас я не прошу полного решения (я хочу быть в состоянии сделать это самостоятельно), но есть только одна вещь, которую я не могу осознать, это TCHAR* argv. Я знаю, что argv[1] содержит то, что я поместил в свойства своего проекта в "аргументы команды", и сейчас он содержит каталог, в котором я хочу протестировать свое приложение (C:/users/name/New folder/*), который содержит некоторые папки с подпапками и несколько случайных файлов. В настоящее время argv[1] выдает следующую ошибку:

Ошибка: аргумент типа "_TCHAR*" несовместим с параметром типа "const char *"

Теперь я погуглил TCHAR и понял, что это либо wchar_t*, либо char *, в зависимости от того, используется ли кодировка Unicode или многобайтовый набор символов (в настоящее время я использую Unicode). Я также понимаю, что преобразование - это огромная боль. Итак, я спрашиваю: как мне лучше всего обойти это с помощью параметров _TCHAR и _findfirst?

Я планирую присоединить dirEntry.name к argv[1], а также конкатенировать "*" в конце и использовать это в другом _findfirst. Любые комментарии к моему коду также приветствуются, так как я все еще изучаю C++.

2 ответа

Решение

Используйте это просто typedef:

typedef std::basic_string<TCHAR> TCharString;

Тогда используйте TCharString где бы вы ни использовали std::string, например, здесь:

vector<TCharString> dirArray;

Смотрите здесь информацию о std:: basic_string.

Смотрите здесь: _findfirst для многобайтовых строк, а _wfindfirst для широких персонажей. Если вы используете TCHAR в своем коде, используйте _tfindfirst (макрос), который преобразуется в _findfirst для не UNICODE и _wfindfirst для UNICODE.

Также вместо _finddata_t используйте _tfinddata_t, который также разрешит исправить структуру в зависимости от конфигурации UNICODE.

Другое дело, что вы должны использовать также правильный литерал, _T("C:/*") будет L"C:/*" на UNICODE построить, и "C:/*" иначе. Если вы знаете, что строите с определением UNICODE, используйте std::vector<std::wstring>,

Кстати. Visual Studio по умолчанию создаст проект с UNICODE, вы можете использовать только широкие версии функций, таких как _wfindfirst поскольку нет веских оснований для создания проектов, не являющихся UNICODE.

TCHAR и я понимаю, что это либо wchar_t*, либо char* в зависимости от использования набора символов UTF-8 или многобайтового набора символов (в настоящее время я использую UTF-8).

это неправильно, в UNICODE windows apis использует UTF-16. sizeof(wchar_t)==2,

Другие вопросы по тегам