filesystem::directory_iterator и кириллица

Рейтинг: 0Ответов: 0Опубликовано: 22.02.2023

Продолжение вопроса Ошибка при компиляции - error_code (boost::filesystem::directory_iterator), но пробую решить по другому.

Посоветовали всё перевести в wstring.

Изменено 2:

Изменил точку входа, ошибка пропала.

Пробую решить методом: Русский язык в консоли

#include <iostream>
#include <string>
#include <string.h>
#include <windows.h>
#include <filesystem>
#include <io.h>
#include <fcntl.h>

using namespace std;



class Find {

private:

wstring null = L"?";

wstring findFile_ (wstring name, wstring path) {
    wcout << name << "  " << path << endl;

    wstring temp;
    error_code ec;
wcout << "1" << endl;
    for (auto& file : filesystem::directory_iterator(name, ec)) {
wcout << "2" << endl;
        temp = file.path().wstring();
        wcout << temp << endl;
        if (filesystem::is_directory(file)) {
            wstring find = findFile_(name, temp);
            if (find != null) return find;
        } 
        if (name == temp.substr(temp.find_last_of(L"\\") + 1, wstring::npos)) return file.path().wstring();
    }
wcout << "3" << endl;
    return null;
}



public:
wstring findFile (wstring name) {
    DWORD drives = GetLogicalDrives();
    char diskName;
    wstring disk;
    wstring ret;
    for (unsigned char i = 0; i < 32; i++) {

        if (drives & (1 << i)) {
            diskName = 'A' + i;
            disk.clear();
            disk.push_back(diskName);
            disk += L":\\";
            ret = findFile_(name, disk);
            if (ret != null) return ret;   
        }
    }
    return null;
}

};


int main () {

    _setmode(_fileno(stdout), _O_U16TEXT);
    _setmode(_fileno(stdin),  _O_U16TEXT);
    _setmode(_fileno(stderr), _O_U16TEXT);

    wcout << L"Unicode -- English -- Русский -- Ελληνικά -- Español -- Українська." << endl;
    

    Find f;
    wcout << f.findFile(L"Aboba.txt") << endl;
    system("pause");
    return 0;
}

Теперь другая проблема:

Не срабатывает цикл

for (auto& file : filesystem::directory_iterator(name, ec)) {
wcout << "2" << endl;
        temp = file.path().wstring();
        wcout << temp << endl;
        if (filesystem::is_directory(file)) {
            wstring find = findFile_(name, temp);
            if (find != null) return find;
        } 
        if (name == temp.substr(temp.find_last_of(L"\\") + 1, wstring::npos)) return file.path().wstring();
    }

Выводит в консоль:

Unicode -- English -- Русский -- Ελληνικά -- Español -- Українська.
Aboba.txt  C:\
1
3
Aboba.txt  F:\
1
3
?
Для продолжения нажмите любую клавишу . . .

Думаю, причина в name, но не знаю, как можно это проверить и исправить

Ответы

Ответов пока нет.