我正在尝试识别目录条目的文件类型(Windows Unix等等。)。
在sys / stat.h中,st_mode字的高阶nybble具有编码值:
#define S_IFDIR 0x4000 /* directory */
#define S_IFIFO 0x1000 /* FIFO special */
#define S_IFCHR 0x2000 /* character special */
#define S_IFBLK 0x3000 /* block special */
#define S_IFREG 0x8000 /* or just 0x0000, regular */
从评论中可以看出,nybble可以代表0或8 一个'常规文件'。
所以这就引出了一个问题:它在什么情况下是0而不是8? 如果我已经定义了这些代码,我会保留0来代替 未知/未定义/无效/非文件或类似内容。
确实S_ISREG宏是:
#define S_ISREG(m) ((m) & S_IFREG)
在我看来,这表明应该是常规文件 总是应该有代码8(0会是一个abberation?)。
将0解释为未知或无效文件并忽略'或仅0x0000'注释并始终期望8用于所有常规文件是否是一个有效的假设?
答案 0 :(得分:1)
大多数消息来源表明检查S_ISREG就足够了;我不确定你什么时候会看到0x0000作为“常规”文件。
我相信一些旧的实现使用了0x0000(一个非常古老的DJGPP标头搜索将其转换为此)但它是我能找到的唯一真正的引用。其他一切都指向0x8000。
基本上,使用S_ISREG宏并希望你正在编译的任何标题都是正确的。
答案 1 :(得分:0)
我相信S_IFREG和S_ISREG的定义。我从未使用破坏这些宏的文件系统。
我的猜测是,常规文件的0x0000定义是处理可能使用不同文件类型信息编码的旧文件系统。您使用的操作系统和文件系统是什么?