So che (su Linux almeno, con i file system nativi come Ext3) i percorsi dei file possono in teoria essere piuttosto lunghi, e PATH_MAX
è spesso (ma non sempre) grande come 4096 (vedi questo ; e questo spiega che potrebbe essere più lungo o definito in fase di esecuzione!).
Tuttavia, i percorsi dei file sono spesso costruiti al volo e non è insolito in C codificare qualcosa come
#define MY_PATH_MAX 256
char pathbuf[MY_PATH_MAX];
snprintf (pathbuf, sizeof(pathbuf), "%s/%s", getenv("HOME"), somevar);
FILE *f = fopen(pathbuf, "r");
//// etc, avoiding error checks for simplicity
Ora, credo che avere MY_PATH_MAX
non sia troppo grande (in particolare per evitare di consumare molto spazio sul frame dello stack di chiamate) sia praticamente importante e ragionevole. Quindi, nell'esempio precedente fare #define MY_PATH_MAX PATH_MAX
sarebbe sciocco (non è necessario spendere 4Kbyte nel mio frame di chiamata).
Sto codificando dal 1974 e non ho mai incontrato un caso in cui il percorso di un file fosse più grande di una larghezza dello schermo, ad es. 80 caratteri o così. Tutti i file system di cui ho sentito parlare non hanno una gerarchia di directory molto profonda (un file con 8 directory sopra è molto insolito).
Quindi, la mia intuizione è corretta? Il software reale si preoccupa di percorsi di file così lunghi o bizzarri? Allo stesso modo, non ho mai incontrato nessun nome di file che contenga una nuova riga (e raccomando vivamente contro gli spazi nei nomi di file!).
IIUC, non sarai in grado di creare un software GNU come GCC in una directory il cui nome contiene spazi o newlines ... molto probabilmente gli script relativi a autoconf
ne risentirebbero ... Inoltre, non c'è semplicemente modo di dare al tuo /etc/passwd
a $HOME
contenente newline o anche a due punti :
-come passwd(5) non lo supporta.
Il mio limite pratico di 256 byte in un percorso file è un buon limite?
Per i commenti, l'ho appena aggiornato a 384 ...
Hai un esempio pratico in cui i nomi dei percorsi di file lunghi sono rilevanti? Sono principalmente interessato ai sistemi POSIX o Linux!