【问题标题】:windows and linux discrepancy: backslash and forward slash in c++windows和linux的差异:c++中的反斜杠和正斜杠
【发布时间】:2018-11-16 08:30:08
【问题描述】:

在windows我有

std::string graphdir = projDir + "graph\\";
int mkdirsf=_mkdir(graphdir.c_str());

以上方法在 Windows 中运行良好。但是在 linux 中,您知道使用了正斜杠 /。所以上面会创建一个名为graph\的文件夹。有没有一种通用的方法可以输入正确的文件夹而不用担心/\

【问题讨论】:

  • 在某些限制内,Windows 自 DOS 时代起就支持正斜杠 /。否则使用std::filesystem(或Boost filesystem)。
  • 确实,在 Windows 上也可以尝试使用 /,看看它是否有效。我认为应该。
  • 您的标准库实现将确保 / 在 Windows 上工作。
  • 通常只有windows下的command shell(cmd.exe)不理解正斜杠,WinAPI(通常)可以。

标签: c++ linux windows


【解决方案1】:

即使在 Windows 上,您也可以考虑使用正斜杠作为目录分隔符。大多数 Windows 库都能够将它们转换为反斜杠(它们实际上不进行转换,而是根据需要理解它们;其余的是实现细节)

否则,请注意 C++11(或 C++14)标准不了解“文件夹”(您实际上是指 directories;因为文件夹只是 GUI 人工制品;请阅读例如 n3337 到查看)。 C++17 有std::filesystem

也许您应该考虑一些其他库或框架:BoostPOCOQt 都知道如何处理常见操作系统(Windows、Linux、MacOSX、Android)上的目录。

一个更重要的问题是“驱动器”号。对于 Windows(甚至某些 MS-DOS)C:/FOO/BAR.TXT(或者,使用反斜杠,C:\FOO\BAR.TXT)和D:/FOO/BAR.TXT 指的是不同的文件。 Linux 或 MacOSX 中没有真正的等价物。因为mount points 更通用。

最后,文件层次结构约定(和文件系统)因操作系统而异。对于 Linux,请参阅 hier(7)path_resolution(7)。请注意,globbing 也是特定于操作系统的(并且发生方式不同:在 Unix 系统中,它通常由 shells 完成;在 Windows 上,它可能在每个应用程序中由一些 crt0 完成,类似于 @987654333 @)。对于 Linux,另请参阅 glob(7)

顺便说一句,也许你可以考虑在你的 Windows 机器上使用WSL。在幸运的情况下,相同的可执行文件可以在 Linux 和 Windows(在 WSL 下)上运行,这让您的工作更轻松(当它可用时)。

花时间阅读更多关于operating systemsfile systems 的信息。我推荐Operating System: Three Easy Pieces 教科书(可免费下载)。

您会发现阅读有关您的操作系统的更多信息很有用。对于 Linux,请阅读 ALP(或一些较新的书),然后阅读 syscalls(2)intro(3) 等...对于 Windows,学习 WinAPI(我不知道),也许从 here 开始。

在Linux上,与目录相关的API包括mkdir(2)chdir(2)rmdir(2)getcwd(2)stat(2)opendir(3)closedirreaddir(3)nftw(3)等,等等......请注意,文件在 Linux 上只是一个 i-node(阅读 inode(7) 和大约 hard links),并且可以在 多个 目录中(或没有),请参阅 @987654355 @。 AFAIU,这与 Windows 产生了巨大的不同。

PS。我从未使用过 Windows,也从未为它编写代码。

【讨论】:

  • “大多数 Windows 库都能够将它们转换为反斜杠。”我认为首先不需要转换它们。即使是最底层的函数也会平等对待它们。
  • DOS 和 CP/M 对正斜杠很满意,因为他们引入了子目录。
  • 除非应用程序在 Windows 10 中运行并且在系统级别和应用程序清单中都启用了长路径支持,否则运行时库中的路径规范化仅限于 MAX_PATH。那是 259 个字符,或创建目录时为 247 个(为 8.3 文件名留出空间)。绕过规范化的另一个原因是为了避免古怪的规则,例如每个目录中的 DOS 设备,而不考虑扩展名(例如“nul.txt”),并允许名称带有尾随空格和点。跳过规范化需要一个“\\?\”本地设备路径,它只能使用反斜杠作为路径分隔符。
  • 另外,被广泛使用的shell path API根本不理解正斜杠。
  • 还必须考虑,大多数 Windows 程序将正斜杠解释为命令行参数的引入。例如。如果您调用像“some.exe /mylocalpath/subdir”这样的子进程,它可能会将第二个参数视为名为“/mylocalpath/subdir”的命令行标志,而不是将其视为路径参数。
猜你喜欢
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2016-03-12
  • 2019-12-12
  • 2012-05-17
相关资源
最近更新 更多