Longueur maximum de chemin de fichier ?

Un pote me demande quelle longueur maximum peut avoir un chemin complet de fichier, dans le style :
/machin/truc.chose/bidule.ghi/fichier-dont-le-nom-est-vachement-trop-long.txt

Je n’ai pu lui répondre. 255 ? Je n’ai pas trouvé de réponse dans Google ni dans Ubuntu.
Qui sait ? Merci d’avance.

Salut
très bonne question ca !

je ne connaissais pas la réponse, mais j’ai trouvé ca :

PATH_MAX simply isn't. Each system can define PATH_MAX to whatever size it likes. On my Linux system, I see it's 4096, on my OpenBSD system, I see it's 1024, on Windows, it's 260.
je crois que tu préfères en bon francais :
La longueur maximum n'existe pas. Elle peu être définie sur chaque système à une valeur quelconque. Je vois qu'elle est de 1024 sur ma BSD, 4096 sur ma distro linux et 260 sur mon install windows
chez moi ca donne : cat /usr/src/linux-headers-$(uname -r)/include/linux/limits.h | grep PATH_MAX #define PATH_MAX 4096 /* # chars in a path name including nul */

chars in a path name including nul */ > ca semble être le nombre de caractère acceptés
vu la localisation, recompilation du kernel obligatoire pour modifier cette valeur ?

PATH_MAX ne défini pas la longeur maximale absolue mais la longeur maximale relative d’un chemin. Tu peux faire plusieurs sauts de PATH_MAX pour atteindre ton fichier. En fait ca va plutôt dépendre du FS utilisé et de l’appli qui peuvent aussi limiter le nombre de repertoires dans une arboresence. Par exemple avec :

$ d=/tmp; i=17; while [ $i -gt 0 ] ; do d=$d/$(printf "%0255d" 1); i=$(($i - 1));done $ echo $d | wc -c 4357 $
tu peux faire

$ mkdir -p $d $
mais pas

$ cd $d bash: cd: /tmp/000000000...00000000000001: Nom de fichier trop long $
On peut atteindre le dernier répertoire en faisant plusieurs cd (même si bash n’aime pas trop).

La taille de PATH_MAX est en octet ou en CHAR_MAX pas en caractère. En UTF-8, é vaut 2 octects et e 1 octet.

voir man limits.h pour plus d’info.

Merci à traaf, j’ai la même valeur 4096 octets / caractères.
Le problème de mon pote semble plutôt du côté de Windows, où sa clé USB rencontre des problèmes de longueur de chemin ; du coup pas de problème sous Linux.

SaitMoh, c’est un renseignement supplémentaire ; mais quand on fait ‹ à la main › on évite d’avoir à dactylographier vraiment trop long, le risque d’erreur augmentant exponentiellement avec cette longueur !
Mais tu fais bien de rappeler qu’on peut presque tout faire en bash.

o_O

il me scotche à chaque fois
quelle encyclopédie !!

tiens, j’ai pas la page de manuel de <limits.h>, moi

bon, je l’ai trouvée ici
http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?limits.h

Dans /usr/src/etc. j’ai trouvé ceci dans le limits.h local :

#ifndef _LINUX_LIMITS_H
#define _LINUX_LIMITS_H

#define NR_OPEN 1024

#define NGROUPS_MAX 65536 /* supplemental group IDs are available /
#define ARG_MAX 131072 /
# bytes of args + environ for exec() /
#define LINK_MAX 127 /
# links a file may have /
#define MAX_CANON 255 /
size of the canonical input queue /
#define MAX_INPUT 255 /
size of the type-ahead buffer /
#define NAME_MAX 255 /
# chars in a file name /
#define PATH_MAX 4096 /
# chars in a path name including nul /
#define PIPE_BUF 4096 /
# bytes in atomic write to a pipe /
#define XATTR_NAME_MAX 255 /
# chars in an extended attribute name /
#define XATTR_SIZE_MAX 65536 /
size of an extended attribute value (64k) /
#define XATTR_LIST_MAX 65536 /
size of extended attribute namelist (64k) */

#define RTSIG_MAX 32
#endif

Et il s’agit bien de caractères…
La longueur des arguments ARG_MAX à passer à une fonction est « limité » à 131 ko ! :lol:

Dans /usr/src/etc. j'ai trouvé ceci dans le [b]limits.h[/b] local : #define [b]PATH_MAX 4096[/b] /* # chars in a path name including nul */

Et il s’agit bien de caractères…


NON ! Il s’agit de type char de taille CHAR_MAX. Le type caractère n’exite pas.

La longueur des arguments ARG_MAX à passer à une fonction est « limité » à 131 ko ! :lol:
131 mille bits ou 128 kio