C ++ Boost :: filesystem ::具有unicode字符的路径

时间:2015-06-02 12:44:07

标签: c++ boost boost-filesystem

我是C ++的新手,需要一点帮助。我有三个文件夹 - 一个用英文,一个用日文,一个用俄文用于测试目的。当我运行这个小程序时

release

只识别英文字母。 这是输出的外观

#include <windows.h>
#include <string>
#include <iostream>
#include <boost/filesystem.hpp>
#include <boost/locale.hpp>

using namespace boost::filesystem;
using namespace std;

void iterateDirs(const path &dir_path, vector<path> &dir)
{
    if ( exists( dir_path ) )
    {
        directory_iterator end_itr;
        for ( directory_iterator itr(dir_path); itr != end_itr; ++itr ) {
            if ( is_directory(itr->status()) ) {
                cout << *itr << endl;
                dir.push_back(itr->path());
                cout << dir.size() << endl;
            }
        }
    }
}

int main() {
    vector<path> dirs;

    iterateDirs("D:/Test", dirs);
    for (path p : dirs) {
        cout << p << endl;
    }
    return 0;
}

它似乎只是cout问题,因为当我尝试使用矢量项目执行任何操作(例如使用winapi在资源管理器中打开这些文件夹)时,程序代码只能识别英文命名文件夹。

我搜索了这个网站,谷歌搜索解决方案,但他们都没有工作。尝试使用wcout wstring wchar_t等没有任何作用。

在Windows 8上使用mingw w64 4.0和gcc以及clion / cmake。 谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,unicode输出到Windows控制台并不容易。最可靠的方法 - 使用_cputws或WriteConsoleW - 但这些函数直接写入控制台,流重定向不能与它们一起使用。这个计划:

node

使用光栅字体在cmd中生成下一个输出:

#include <windows.h>
#include <string>
#include <iostream>
#include <boost/filesystem.hpp>
#include <boost/locale.hpp>

using namespace boost::filesystem;
using namespace std;

void iterateDirs(const path &dir_path, vector<path> &dir)
{
    if ( exists( dir_path ) )
    {
        directory_iterator end_itr;
        for ( directory_iterator itr(dir_path); itr != end_itr; ++itr ) {
            if ( is_directory(itr->status()) ) {
                _cputws(itr->path().wstring().c_str());
                _cputws(L"\n");
                dir.push_back(itr->path());
                cout << dir.size() << endl;
            }
        }
    }
}

int main() {
    vector<path> dirs;

    iterateDirs(".", dirs);
    for (path p : dirs) {
        _cputws(p.wstring().c_str());
        _cputws(L"\n");
    }
    return 0;
}

以及conemu

中cmd的下一个输出
C:\w\1>test
.\CMakeFiles
1
.\??????????????
2
.\CMakeFiles
.\??????????????

因此,在运行您的应用之前,您需要确保可以使用C:\w\1>test .\CMakeFiles 1 .\اختبارテスト試験Про 2 .\CMakeFiles .\اختبارテスト試験Про 查看目录名称。