Windows和Linux的差异:C++中的反斜杠和正斜杠

5
在Windows中,我有:
std::string graphdir = projDir + "graph\\";
int mkdirsf=_mkdir(graphdir.c_str());

以上代码在Windows系统中运行很好。但是在Linux中,你知道要使用前斜杠/。所以以上代码会创建一个名为graph\的文件夹。是否有一种通用的方法可以输入正确的文件夹而不必担心/\


4
自从 DOS 时代以来,Windows 一直支持正斜杠 / (forward slashes),但受到一定的限制。否则,请使用 std::filesystem(或 Boost 文件系统)。 - Some programmer dude
2
确实,也可以在Windows上尝试使用“/”,看看是否有效。我认为应该是有效的。 - hyde
1
您的标准库实现将确保在Windows上/正常工作。 - molbdnilo
1
通常只有Windows下的命令行壳程序(cmd.exe)不理解正斜杠,WinAPI(通常)是可以理解的。 - Aconcagua
1个回答

14
你可以考虑在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中,它可能会被一些类似于runtime systemcrt0东西在每个应用程序中完成)。对于Linux,请参见glob(7)
顺便说一句,也许你可以考虑在Windows机器上使用WSL。在幸运的情况下,相同的可执行文件可以在Linux和Windows(在WSL下)上运行,这使得您的工作更加容易(当它可用时)。
请花些时间了解操作系统文件系统。我推荐免费下载的操作系统:三个简单部分教材。
你可以阅读更多关于你的操作系统的内容。对于Linux,阅读ALP(或一些更新的书籍),然后是syscalls(2)intro(3)等等... 对于Windows,学习WinAPI(我不了解它),也许从这里开始。
在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的内容),可以存在于几个目录(或没有),请参见link(2)。据我所知,这使得它与Windows有巨大的区别。

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


大多数Windows库都能将它们转换为反斜杠。我认为无需先进行转换,即使是最底层的函数也可以平等处理它们。 - glglgl
1
DOS和CP/M很高兴使用正斜杠,因为它们引入了子目录版本。 - Swordfish
2
除非在Windows 10中启用了长路径支持,包括系统级别和应用程序清单中的支持,否则运行时库中的路径规范化仅限于MAX_PATH。这是259个字符,或者在创建目录时为247个字符(留有8.3文件名的空间)。绕过规范化的另一个原因是避免奇怪的规则,例如每个目录中都有DOS设备,无论扩展名如何(例如“nul.txt”),并允许带有尾随空格和点的名称。跳过规范化需要一个“\?\”本地设备路径,该路径只能使用反斜杠作为路径分隔符。 - Eryk Sun
1
此外,广泛使用的shell path API根本不理解正斜杠。 - zett42
1
还需考虑到,大多数 Windows 程序将正斜杠解释为引入命令行参数。例如,如果您像这样调用子进程:"some.exe /mylocalpath/subdir",它可能会将第二个参数视为名为 "/mylocalpath/subdir" 的命令行标志,而不是将其视为路径参数。 - zett42
那个ALP(高级Linux编程)的链接已经失效了 :( 点击后你只能查看版权信息... - Robert Houghton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接