4


0

ディレクトリエントリのファイルタイプを識別しようとしています(Windows Unixなど)。

sys / stat.hでは、st_modeワードの上位ニブルにコード化値があります。

#define S_IFDIR 0x4000 / *ディレクトリ* / #define S_IFIFO 0x1000 / * FIFOスペシャル* / #define S_IFCHR 0x2000 / *キャラクタースペシャル* / #define S_IFBLK 0x3000 / *ブロックスペシャル* / #define S_IFREG 0x8000 / * * /

コメントから、ニブルは「通常のファイル」を表すために0または8のいずれかになる可能性があるようです。

それで、これは疑問を投げかけます:どんな状況でそれは8でなく0であるか? これらのコードを定義したのであれば、unknown / undefined / invalid / not-a-fileなどを示すために0を予約します。

確かにS_ISREGマクロは次のとおりです。

#define S_ISREG(m)((m)

これは私には普通のファイルが常にコード8を持つと期待されるべきであることを示すように思われるでしょう(そして0は異常終了でしょうか?)

0を未知または無効なファイルとして解釈し、 'または単に0x0000’コメントを無視し、常に8がすべての通常のファイルに使用されることを期待するのは妥当な仮定でしょうか。

2 Answer


1


ほとんどの資料によると、S_ISREGをチェックするだけで十分です。 0x0000が「通常の」ファイルとして表示されるのかどうかはわかりません。

私はいくつかの古い実装が0x0000(本当に古いDJGPPヘッダ検索がこれを引き起こす)を使ったと思いますが、それは私が見つけることができる唯一の本当の参照です。 他のすべては0x8000を指します。

基本的には、S_ISREGマクロを使用して、コンパイルしているものに関係なくヘッダーが正しいことを実行することを願います。


0


私はS_IFREGとS_ISREGの定義を信頼するでしょう。 これらのマクロを壊したファイルシステムを使ったことは一度もありません。

私の推測では、通常のファイルの0x0000定義は、ファイルタイプ情報の異なるエンコーディングを使用した可能性があるレガシファイルシステムを処理することです。 どのOSとファイルシステムを使用していますか?