2017-10-18 3 views
0

Ich bin verwirrt durch die Verwendung von d_name[256] und NAME_MAX in struct Dirent Definition. Bedeutet d_name[256], dass die Länge des Dateinamens höchstens 256 Zeichen betragen darf? Dann erwähnt es auch NAME_MAX (unten zitiert). Also, meine Frage ist, wie NAME_MAX bezieht sich hier und wo kann ich NAME_MAX Wert und Definition finden?struct dirent in C d_name [256] und NAME_MAX Definition

In man readdirstruct dirent ist wie folgt definiert.

struct dirent { 
    ino_t   d_ino;  /* inode number */ 
    off_t   d_off;  /* not an offset; see NOTES */ 
    unsigned short d_reclen; /* length of this record */ 
    unsigned char d_type;  /* type of file; not supported 
            by all filesystem types */ 
    char   d_name[256]; /* filename */ 
}; 

Es behauptet auch, daß

die einzigen Felder, in der Struktur, die durch dirent POSIX.1 beauftragt werden, sind: d_name[], nicht spezifizierter Größe, mit höchstens NAME_MAX Zeichen vor der abschließenden Null Byte ('\ 0'); und (als XSI extension sion) d_ino. Die anderen Felder sind nicht standardisiert und nicht auf allen Systemen vorhanden; Weitere Details finden Sie in den HINWEISEN.

Antwort

2

NAME_MAX ist in limits.h deklariert. Sie können auch pathconf() oder fpathconf() verwenden, um das Limit pro Dateisystem zu erhalten.

long max = pathconf(pathname, _PC_NAME_MAX); 

Da die Struktur hat diese hartcodiert zu 256, kann es nicht tatsächlich Dateisysteme mit längeren Dateinamen umgehen. So NAME_MAX wird unbedingt höchstens 255 sein (das ist in der Tat sein Wert auf meinem OS X-Rechner).

+0

NAME_MAX enthält nicht den Terminator, nur strlen, so dass er mit d_name übereinstimmt. –