2009-06-25 1 views
4

Ich versuche, Dateitypen für Verzeichniseinträge (Windows Unix etc ..) zu identifizieren.Dateityp Indikator, sys/stat.h st_mode regulären Dateicode Wert

In sys/stat.h des hohen Auftrags nybble des st_mode Wort haben die codierten Werte:

#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 */ 

Aus dem Kommentar scheint es der nybble sein könnte entweder 0 oder 8 darstellen eine ‚reguläre Datei ".

So stellt sich die Frage: unter welchen Umständen ist es 0 und nicht 8? Wenn ich diese Codes definiert hätte, hätte ich 0 reserviert unbekannt/undefined/ungültig/keine-Datei oder so ähnlich.

der Tat das S_ISREG Makro ist:

#define S_ISREG(m) ((m) & S_IFREG) 

Dies scheint mir würde, um anzuzeigen, dass sollte eine reguläre Datei immer zu erwarten werden, um den Code 8 (würde und 0 ein abberation sein?).

Wäre es eine gültige Annahme, 0 als unbekannte oder ungültige Datei zu interpretieren und den Kommentar 'oder nur 0x0000' zu ignorieren und immer 8 für alle regulären Dateien zu erwarten?

Antwort

1

Die meisten Quellen geben an, dass die Überprüfung von S_ISREG ausreichend ist; Ich bin mir nicht sicher, wann Sie 0x0000 als "normale" Datei sehen würden.

Ich glaube, einige alte Implementierungen verwendet 0x0000 (eine wirklich alte DJGPP-Header-Suche macht dies aus), aber es ist die einzige echte Referenz, die ich finden kann. Alles andere zeigt auf 0x8000.

Verwenden Sie im Grunde das S_ISREG-Makro und hoffe, dass die Kopfzeile auf dem, was Sie kompilieren gegen das Richtige tut.

0

Ich würde den Definitionen von S_IFREG und S_ISREG vertrauen. Ich habe noch nie mit einem Dateisystem gearbeitet, das diese Makros kaputt gemacht hat.

Meine Vermutung ist, dass die 0x0000-Definition für eine reguläre Datei ältere Dateisysteme behandelt, die möglicherweise eine andere Codierung von Dateitypinformationen verwendet haben. Welches Betriebssystem und welches Dateisystem benutzen Sie?