winapi - 为什么 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 上创建带有“/”的目录,这是不支持的通过这个函数)。
解决方案
Windows 的许多部分都接受正斜杠和反斜杠,包括几乎所有的文件 API。两个斜杠都是保留字符,不能出现在文件或目录名中。
我不确定这是否在中心位置详细说明,但对于文件 API,命名文件、路径和命名空间文档有这样的说法:
Windows API 中的文件 I/O 函数将“/”转换为“\”作为将名称转换为 NT 样式名称的一部分,除非使用“\?\”前缀,如以下部分所述。
至于:
假设“/”用作“开关”字符
由于在命令行上必须引用包含空格的任何文件或目录路径,因此您可以使用来自该空格字符或引号规则的任何开关/参数的正斜杠安全地拆分此类路径。类似于-
在文件和目录名称中没有问题,但也被许多程序用于命令行切换。
推荐阅读
- javascript - 在这个 HTML 文件中,我想调用另一个 HTML 文件
- java - 如何使用 setOnClickListener 将按钮文本设置为“单击”
- c++ - 如何将 C++ 概念与 type_traits 结合使用?
- reactjs - React Provider(Typescript)值不兼容
- java - 当任一输入发生变化时,相应地筛选数据
- node.js - 无法使用 Azure 函数节点将文件上传到 Azure Blob 存储
- html - CSS 网格不受 padding-bottom 影响
- r - 光栅包在光栅化时会占用 RAM
- python - 是什么导致我的回调中的位置参数数量不正确?
- python - 为什么我的函数返回 None 而不是我的键值