【问题标题】:What is the correct syntax for portable fstream file paths?可移植 fstream 文件路径的正确语法是什么?
【发布时间】:2015-03-04 11:41:10
【问题描述】:

我一次又一次地看到这个烦人的问题。您能否分享您的知识,这可能有助于我们找到答案。

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

谢谢

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

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

A. "::目录:file.bin"

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

C. "/directory/file.bin"

D. "C://目录//File.bin"

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

【问题讨论】:

标签: c++ file-io fstream


【解决方案1】:

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

可以在std::fopen 文档中找到答案:(由fstream 通过filebuf::open 引用)

注意事项

文件名的格式是实现定义的,没有 必须引用一个文件(例如,它可能是控制台或另一个 设备可通过文件系统 API 访问)。在支持的平台上 它们,文件名可能包括绝对或相对文件系统路径。

【讨论】:

  • 参考文档回答很好,非常感谢。
【解决方案2】:

您和我们其他许多人热切期待的是文件系统技术规范: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

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

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

【讨论】:

    【解决方案3】:

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

    也就是说,如果您对这个“问题空间”感兴趣,您可能想查看boost filesystem library,它不是标准的,但至少广为人知....

    【讨论】:

      【解决方案4】:

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

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

      我在这里写了更多关于此的内容:https://stackoverflow.com/a/40980510/2345997

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 2010-11-19
        • 2013-10-12
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多