便携式 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) - 没有可移植的标准,因为不同的文件系统和操作系统有不同的期望和限制。 fstream
s 不会限制您使用所有实际实现的始终支持的最小子集,否则您只能将“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
您具体要找的是path
:http://en.cppreference.com/w/cpp/experimental/fs/path
通过现在回答你的问题,如果你想这样做,你需要使用 #ifdef
s 并在每个目标平台上实现你的代码。
路径不可移植。尝试使用可移植语法是徒劳的,因为您提出的任何语法都可能无法在未来的文件系统之间移植。但是,应该可以执行以下操作之一:
- 设计您的应用程序,以便您不需要存储路径。
- 使用您自己的路径格式,您可以将其转换为当前系统上的路径。
- 将您的应用程序使用的路径限制为可移植(Windows/Linux 之间)子集(例如:以“/”作为路径分隔符的相对路径)
- 为同一路径存储多个版本,并在每个受支持的路径上使用正确的版本 OS。
- 存储一种形式的路径(例如 Linux 路径)并使用简单的方案转换为例如:Windows 路径。记录此方案,以便用户了解路径的解释方式。
我在这里写了更多:
这个烦人的问题我已经看到好多次了。您能否分享您的知识,这可能有助于我们找到答案。
我的困惑是,正斜杠是 posix 标准,但操作系统的目录结构不同。
谢谢
可移植 fstream 文件路径的正确语法是什么?
(例如,您将传递给 std::fstream:open() 以打开文件的字符串。)
一个。 "::目录:file.bin"
乙。 "C:/Directory/File.bin"
C. "/directory/file.bin"
D. "C://Directory//File.bin"
E. std:fstream 文件路径不可移植。
(E) - 没有可移植的标准,因为不同的文件系统和操作系统有不同的期望和限制。 fstream
s 不会限制您使用所有实际实现的始终支持的最小子集,否则您只能将“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
您具体要找的是path
:http://en.cppreference.com/w/cpp/experimental/fs/path
通过现在回答你的问题,如果你想这样做,你需要使用 #ifdef
s 并在每个目标平台上实现你的代码。
路径不可移植。尝试使用可移植语法是徒劳的,因为您提出的任何语法都可能无法在未来的文件系统之间移植。但是,应该可以执行以下操作之一:
- 设计您的应用程序,以便您不需要存储路径。
- 使用您自己的路径格式,您可以将其转换为当前系统上的路径。
- 将您的应用程序使用的路径限制为可移植(Windows/Linux 之间)子集(例如:以“/”作为路径分隔符的相对路径)
- 为同一路径存储多个版本,并在每个受支持的路径上使用正确的版本 OS。
- 存储一种形式的路径(例如 Linux 路径)并使用简单的方案转换为例如:Windows 路径。记录此方案,以便用户了解路径的解释方式。
我在这里写了更多: