便携式 fstream 文件路径的正确语法是什么?

What is the correct syntax for portable fstream file paths?

这个烦人的问题我已经看到好多次了。您能否分享您的知识,这可能有助于我们找到答案。

我的困惑是,正斜杠是 posix 标准,但操作系统的目录结构不同。

谢谢

可移植 fstream 文件路径的正确语法是什么?

(例如,您将传递给 std::fstream:open() 以打开文件的字符串。)

一个。 "::目录:file.bin"

乙。 "C:/Directory/File.bin"

C. "/directory/file.bin"

D. "C://Directory//File.bin"

E. std:fstream 文件路径不可移植。

(E) - 没有可移植的标准,因为不同的文件系统和操作系统有不同的期望和限制。 fstreams 不会限制您使用所有实际实现的始终支持的最小子集,否则您只能将“8.3”文件名写入当前工作目录;-P

就是说,如果您对此 "problem space" 感兴趣,您可能想查看 boost filesystem library,它不是标准的,但至少广为人知... .

E :不可移植,即 实现定义

答案可以在std::fopen docs: (which are referred to by fstream via filebuf::open)

中找到

Notes

The format of filename is implementation-defined, and does not necessarily refer to a file (e.g. it may be the console or another device accessible through filesystem API). On platforms that support them, filename may include absolute or relative filesystem path.

您和我们其他人热切期待的是文件系统技术规范:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4099.html

它主要是 boost/filesystem 到 C++ 标准的导入。

技术规范已作为 C++ experimental 部分的一部分提供。但是,在 gcc 4.9.2 或 Visual Studio 2013.

中并没有默认实现

希望它早日到来!

您可以在此处查看更多信息:http://en.cppreference.com/w/cpp/experimental/fs

您具体要找的是pathhttp://en.cppreference.com/w/cpp/experimental/fs/path

通过现在回答你的问题,如果你想这样做,你需要使用 #ifdefs 并在每个目标平台上实现你的代码。

路径不可移植。尝试使用可移植语法是徒劳的,因为您提出的任何语法都可能无法在未来的文件系统之间移植。但是,应该可以执行以下操作之一:

  1. 设计您的应用程序,以便您不需要存储路径。
  2. 使用您自己的路径格式,您可以将其转换为当前系统上的路径。
  3. 将您的应用程序使用的路径限制为可移植(Windows/Linux 之间)子集(例如:以“/”作为路径分隔符的相对路径)
  4. 为同一路径存储多个版本,并在每个受支持的路径上使用正确的版本 OS。
  5. 存储一种形式的路径(例如 Linux 路径)并使用简单的方案转换为例如:Windows 路径。记录此方案,以便用户了解路径的解释方式。

我在这里写了更多: