windows和linux的差异:c++中的反斜杠和正斜杠
Posted
技术标签:
【中文标题】windows和linux的差异:c++中的反斜杠和正斜杠【英文标题】:windows and linux discrepancy: backslash and forward slash in 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(通常)可以。
【参考方案1】:
即使在 Windows 上,您也可以考虑使用正斜杠作为目录分隔符。大多数 Windows 库都能够将它们转换为反斜杠(它们实际上不进行转换,而是根据需要理解它们;其余的是实现细节)
否则,请注意 C++11(或 C++14)标准不了解“文件夹”(您实际上是指 directories;因为文件夹只是 GUI 人工制品;请阅读例如 n3337 到查看)。 C++17 有std::filesystem。
也许您应该考虑一些其他库或框架:Boost、POCO、Qt 都知道如何处理常见操作系统(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 systems 和file 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)和closedir
、readdir(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”的命令行标志,而不是将其视为路径参数。以上是关于windows和linux的差异:c++中的反斜杠和正斜杠的主要内容,如果未能解决你的问题,请参考以下文章
如何在launch.json的Visual Studio Code中反转$ relativeFile中的反斜杠?