使用filesystem :: path,如何以跨平台方式打开文件?

时间:2016-06-30 13:20:33

标签: c++ c++17

假设您使用了新的std::filesystem(或std::experimental::filesystem)代码来搜寻文件。您有一个path变量,其中包含此变量的完整路径名。

你如何打开该文件?

这可能听起来很愚蠢,但请考虑明显的答案:

std::filesystem::path my_path = ...;
std::ifstream stream(my_path.c_str(), std::ios::binary);

保证不起作用。为什么?例如,在Windows上,path::string_typestd::wstring。因此path::c_str将返回const wchar_t*。并且std::ifstream只能 采用const char*类型的路径。

现在事实证明,这段代码实际上将在VS中运行。为什么?因为Visual Studio有一个library extension that does permit this to work。但这是非标准行为,因此不是便携式。例如,我不知道Windows上的GCC是否提供相同的功能。

你可以试试这个:

std::filesystem::path my_path = ...;
std::ifstream stream(my_path.string().c_str(), std::ios::binary);

只有Windows让我们感到困惑。因为如果my_path碰巧包含Unicode字符,那么现在您依赖于正确设置Windows ANSI语言环境。如果路径恰好包含多个语言中不能存在于同一ANSI语言环境中的字符,那么即使这样也不一定会省钱。

Boost Filesystem实际上遇到了类似的问题。但他们扩展了他们的iostream版本以直接支持path

我在这里遗漏了什么吗?委员会是否添加了跨平台文件系统库而没有添加跨平台方式来打开文件?

1 个答案:

答案 0 :(得分:8)

Bo Persson指出这是https://www.twilio.com/docs/api/rest/message#instance-delete的主题。此缺陷已得到解决,C ++ 17将发布,要求path::value_typechar的实现使其文件流类型除了通常{{1}之外还需要const filesystem path::value_type*版本。