Indicatore del tipo di file, valore di codice file regolare sys / stat.h st_mode
-
22-07-2019 - |
Domanda
Sto cercando di identificare i tipi di file per le voci della directory (Windows Unix ecc.).
In sys / stat.h il nybble di ordine superiore della parola st_mode ha i valori codificati:
#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 */
Dal commento sembra che il nybble possa essere 0 o 8 per rappresentare un "file normale".
Quindi questo pone la domanda: in quali circostanze è 0 e non 8? Se avessi definito questi codici, avrei riservato 0 per inidicare sconosciuto / indefinito / non valido / non un file o qualcosa del genere.
In effetti la macro S_ISREG è:
#define S_ISREG(m) ((m) & S_IFREG)
Questo mi sembra indicare che dovrebbe essere un file normale ci si aspetta sempre che abbia il codice 8 (e 0 sarebbe un'abberazione?).
Sarebbe un presupposto valido interpretare 0 come file sconosciuto o non valido e ignorare il commento 'o solo 0x0000' e aspettarsi sempre che 8 venga usato per tutti i file normali?
Soluzione
La maggior parte delle fonti indica che è sufficiente controllare S_ISREG; Non sono sicuro quando vedresti 0x0000 come " regolare " file.
Credo che alcune vecchie implementazioni usassero 0x0000 (una ricerca di intestazione DJGPP davvero vecchia lo rivela) ma è l'unico vero riferimento che riesco a trovare. Tutto il resto punta a 0x8000.
Fondamentalmente, usa la macro S_ISREG e spera che l'intestazione su qualunque cosa tu stia compilando faccia la cosa giusta.
Altri suggerimenti
Mi fiderei delle definizioni di S_IFREG e S_ISREG. Non ho mai lavorato con un file system che ha rotto quelle macro.
La mia ipotesi è che la definizione 0x0000 per un file normale sia quella di gestire i file system legacy che potrebbero aver usato una diversa codifica delle informazioni sul tipo di file. Quale sistema operativo e file system stai usando?