首页 > 解决方案 > 为什么 GetFileAttributesA() 与 unix 目录路径分隔符一起使用?

问题描述

如上面的标题问题,我当前的工作目录包含一个目录“a”,其中包含另一个目录“b”。目录“b”的正确路径是“a\b”(在 Windows 平台上)。假设“/”用作“开关”字符,我希望函数 GetFileAttributesA() 对指定路径“a/b”给出错误。以下文档没有说明额外的内部路径分隔符转换。

问题是为什么 GetFileAttributesA() 与 unix 路径分隔符一起使用?C++ 代码是 (C++14):

#include <windows.h>
int main()
{
    DWORD gfa1 = GetFileAttributesA("a\\b");
    DWORD gfa2 = GetFileAttributesA("a/b");
    // Both gfa1 and gfa2 are equal to FILE_ATTRIBUTE_DIRECTORY
    // I expect the gfa2 to be INVALID_FILE_ATTRIBUTES
    return 0;
}

我希望函数因“a/b”而失败的原因很简单。为了简化,我有一个函数可以判断特定路径是否是 Linux 和 Windows 系统的目录。只要该函数在 Windows 上对斜杠和反斜杠具有相同的行为,我就被迫在 Linux(分隔符转换)上添加相同的行为,反之亦然(不允许在 Windows 上创建带有“/”的目录,这是不支持的通过这个函数)。

标签: winapi

解决方案


Windows 的许多部分都接受正斜杠和反斜杠,包括几乎所有的文件 API。两个斜杠都是保留字符,不能出现在文件或目录名中。

我不确定这是否在中心位置详细说明,但对于文件 API,命名文件、路径和命名空间文档有这样的说法:

Windows API 中的文件 I/O 函数将“/”转换为“\”作为将名称转换为 NT 样式名称的一部分,除非使用“\?\”前缀,如以下部分所述。

至于:

假设“/”用作“开关”字符

由于在命令行上必须引用包含空格的任何文件或目录路径,因此您可以使用来自该空格字符或引号规则的任何开关/参数的正斜杠安全地拆分此类路径。类似于-在文件和目录名称中没有问题,但也被许多程序用于命令行切换。


推荐阅读