为什么 FILE_ATTRIBUTE_DIRECTORY 是 16,而不是 8?

Mic*_*ter 2 windows winapi

为什么 Microsoft 保留值0x8(8,位 3)作为文件属性常量FILE_ATTRIBUTE_DIRECTORY 0x10(16,位 4)。

位 3 是唯一的保留位。为了什么?

Dav*_*nan 5

通常,保留值表示在过去的某个时刻,也许在早已被弃用的 Windows 发布版本中,或者可能在从未公开发布的开发版本中,该值被用于某种目的,但该值不再具有意义。

通过将该值标记为保留值,可以防止未来的开发人员重复使用该值。如果重复使用该值,则可能会导致遗留软件出现意外行为。

在这种情况下,虽然你说位 3 是保留的,但我在头文件中看不到任何证据。我的头文件有这些宏定义:

#define FILE_ATTRIBUTE_READONLY             0x00000001  
#define FILE_ATTRIBUTE_HIDDEN               0x00000002  
#define FILE_ATTRIBUTE_SYSTEM               0x00000004  
#define FILE_ATTRIBUTE_DIRECTORY            0x00000010  
#define FILE_ATTRIBUTE_ARCHIVE              0x00000020  
#define FILE_ATTRIBUTE_DEVICE               0x00000040  
#define FILE_ATTRIBUTE_NORMAL               0x00000080  
#define FILE_ATTRIBUTE_TEMPORARY            0x00000100  
#define FILE_ATTRIBUTE_SPARSE_FILE          0x00000200  
#define FILE_ATTRIBUTE_REPARSE_POINT        0x00000400  
#define FILE_ATTRIBUTE_COMPRESSED           0x00000800  
#define FILE_ATTRIBUTE_OFFLINE              0x00001000  
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED  0x00002000  
#define FILE_ATTRIBUTE_ENCRYPTED            0x00004000  
#define FILE_ATTRIBUTE_VIRTUAL              0x00010000  
Run Code Online (Sandbox Code Playgroud)

我并没有从中推断出位 3 是保留的,只是没有使用它。

根据评论的讨论,只读、隐藏、系统、目录和归档属性的值与 DOS 和 FAT 文件系统使用的类似值相同。

例如,示例 fastfat 文件系统驱动程序具有以下宏声明:

#define FAT_DIRENT_ATTR_READ_ONLY        0x01
#define FAT_DIRENT_ATTR_HIDDEN           0x02
#define FAT_DIRENT_ATTR_SYSTEM           0x04
#define FAT_DIRENT_ATTR_VOLUME_ID        0x08
#define FAT_DIRENT_ATTR_DIRECTORY        0x10
#define FAT_DIRENT_ATTR_ARCHIVE          0x20
#define FAT_DIRENT_ATTR_DEVICE           0x40
Run Code Online (Sandbox Code Playgroud)

因此我们可以推断,当创建 Windows API 时,这些相同的价值观被继承下来,大概是为了让已经熟悉这些价值观的开发人员不必学习一组新的竞争价值观。DOS/FAT 中第 3 位对应的值没有与 Windows 文件属性直接类似的值,因此未被使用。

不过,所有这些都是猜测,我怀疑您需要找到一位原始 Windows API 开发人员来确认这一点。

  • 位 3 是“FAT_DIRENT_ATTR_VOLUME_ID”(8)。在 FAT 卷上,它在根目录中的文件内部设置以存储卷标。请参阅示例 fastfat 文件系统驱动程序中的 [`FatConstructLabelDirent`](https://github.com/Microsoft/Windows-driver-samples/blob/aa6e0b36eb932099fa4eb950a6f5e289a23b6d6e/filesys/fastfat/dirsup.c#L2435)。另请参阅 [DOS Int 21h 调用](http://www.ctyme.com/intr/int-21.htm) 中对属性 8 / 位 3 的讨论,用于查找文件(例如 AH=11h 和 AH=4Eh)并创建文件(例如AH=16h 和AX=6C00h)来查询和设置卷标。 (3认同)