代码之家  ›  专栏  ›  技术社区  ›  Michel de Ruiter

为什么FILE\u ATTRIBUTE\u目录是16,而不是8?

  •  1
  • Michel de Ruiter  · 技术社区  · 8 年前

    为什么Microsoft保留该值 0x8 (8,第3位)作为 File Attribute Constant ? FILE_ATTRIBUTE_DIRECTORY is 0x10 (16,第4位)。

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

    2 回复  |  直到 8 年前
        1
  •  4
  •   David Heffernan    8 年前

    通常是 保留 值表示在过去的某个时候,可能在早已弃用的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  
    

    我并没有由此推断第3位是保留的,只是没有使用它。

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

    例如 sample fastfat filesystem 驱动程序具有以下宏声明:

    #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
    

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

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

        2
  •  1
  •   Michel de Ruiter    8 年前

    基于一些非常 useful comments ,我想我知道答案了。从…起 wdm.h 自身:

    //
    // Define the file attributes values
    //
    // Note:  0x00000008 is reserved for use for the old DOS VOLID (volume ID)
    //        and is therefore not considered valid in NT.
    //...
    
    #define FILE_ATTRIBUTE_READONLY             0x00000001  
    #define FILE_ATTRIBUTE_HIDDEN               0x00000002  
    #define FILE_ATTRIBUTE_SYSTEM               0x00000004  
    //OLD DOS VOLID                             0x00000008
    
    #define FILE_ATTRIBUTE_DIRECTORY            0x00000010  
    #define FILE_ATTRIBUTE_ARCHIVE              0x00000020  
    #define FILE_ATTRIBUTE_DEVICE               0x00000040  
    #define FILE_ATTRIBUTE_NORMAL               0x00000080  
    ...
    

    值8已用于卷ID,因此NT选择避免使用它。