boost::iostreams:mapped_file_source打开一个具有CJK文件名的文件



假设我们有这样的代码:

boost::iostreams::mapped_file_source dev(paFileName.u8string().c_str());

其中CCD_ 1是CCD_。

在Windows上,std::filesystem::path中的内部字符是wchar_t,但boost::iostreams::mapped_file_source似乎只接受可变宽度的字符串。因此,我们使用方法u8string将固定宽度的wchar_t字符串转换为可变宽度的char字符串。

问题是转换显然导致boost::iostreams::mapped_file_source的ctor无法在文件系统中找到文件,并且ctor将抛出一个paFileName0;打开文件失败:系统找不到指定的文件">

如何解决此问题?有什么建议吗?谢谢

根据编译时错误的消息:

C:/msys64/mingw64/include/boost/iostreams/detail/path.hpp:138:5: note: declared private here
138 |     path(const std::wstring&);
|     ^~~~

不知怎的,Boost.Iotstreams试图将std::filesystem::path转换为boost::iostreams::details::path,但失败了,因为接受宽字符串的转换ctor是不可访问的。这个问题在Linux上不会发生,因为Linux上的文件系统通常使用UTF-8char字符串作为文件名。相反,在Windows上,文件名通常是UTF-16wchar_t字符串。

我的解决方法是避免调用上面提到的转换ctor。我给Boost.Iostreams一个boost::filesystem::wpath,而不是原来的std::filesystem::path,希望Boost版本的wpath更容易被Boost.Iostreams.接受

boost::iostreams::stream<boost::iostreams::mapped_file_source> fin(
boost::filesystem::wpath(static_cast<std::wstring>(paFileName))
);

它是有效的。

最新更新