假设我们有这样的代码:
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将抛出一个paFileName
0;打开文件失败:系统找不到指定的文件">
如何解决此问题?有什么建议吗?谢谢
根据编译时错误的消息:
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))
);
它是有效的。