Longueur maximale du nom de fichier dans NTFS (Windows XP et Windows Vista)?

261

Je conçois une table de base de données qui contiendra les noms de fichiers des fichiers téléchargés. Quelle est la longueur maximale d'un nom de fichier dans NTFS tel qu'utilisé par Windows XP ou Vista?

GateKiller
la source
83
Je n'ai jamais vu autant de réponses différentes à ce qui devrait être une simple question. 199, 255, 256, 257, 260, «environ 30 000», «environ 32 000» et «cela dépend». Bien sûr, il y a des qualificatifs, mais ceux-ci ne peuvent pas tous être corrects, n'est-ce pas?
MickeyfAgain_BeforeExitOfSO
7
son 255, je le sais car j'ai dû créer une application pour empêcher les utilisateurs d'entreprise d'atteindre cela, car cela provoque des problèmes sur nos serveurs de stockage.
RobertPitt
2
@RobertPitt. Vous manquez quelque chose là-dedans. Citation de MSDN: "la longueur maximale d'un chemin est MAX_PATH, qui est définie comme 260 caractères"
Michael Olesen
7
@ Michael9000. Je crois que RobertPitt citait la limite de nom de fichier (qui est le sujet de cette question), pas la limite de chemin.
gdw2
7
NTFS n'est PAS limité à MAX_PATH du tout, le shell Windows est limité à MAX_PATH, la longueur maximale du chemin NTFS est de 32k
paulm

Réponses:

286

Les composants individuels d'un nom de fichier (c'est-à-dire chaque sous-répertoire le long du chemin et le nom de fichier final) sont limités à 255 caractères, et la longueur totale du chemin est limitée à environ 32 000 caractères.

Cependant, sous Windows, vous ne pouvez pas dépasser la MAX_PATHvaleur (259 caractères pour les fichiers, 248 pour les dossiers). Voirhttp://msdn.microsoft.com/en-us/library/aa365247.aspx pour plus de détails.

Adam Rosenfield
la source
4
Voici quelques faits supplémentaires qui confirment cette réponse (Windows est normalement limité à 260 caractères): msdn.microsoft.com/en-us/library/… et blogs.msdn.com/b/bclteam/archive/2007/02/13 /…
Michael Olesen
62
Correct pour NTFS, non correct pour Windows, selon le lien que vous avez fourni: "Dans l'API Windows (avec quelques exceptions décrites dans les paragraphes suivants), la longueur maximale d'un chemin est MAX_PATH, qui est définie comme 260 caractères". Le chemin total est, à toutes fins pratiques, limité à 259 caractères (en tenant compte du terminateur nul).
Lawrence Dol
9
Apparemment, si vous utilisez la "version unicode" des méthodes de fichiers de l'API Windows, vous pouvez obtenir jusqu'à 32767 si vous préfixez les noms de chemin avec "\\? \", N'est-ce pas?
rogerdpack
6
@rogerdpack: pour le chemin complet, oui, mais chaque composant individuel (sous-dossier / fichier final) a une limite de 255 points de code utf-16. De plus, les logiciels normaux attendent MAX_PATH, alors ... boom :)
snemarch
5
Dans Windows 10 (Version 1607 - Mise à jour anniversaire) et Windows Server 2016, vous avez la possibilité d'avoir une option pour ignorer le problème MAX_PATH en remplaçant une entrée de stratégie de groupe activer les longs chemins NTFS sous Configuration ordinateur -> Modèles d'administration -> Système -> Système de fichiers:
Steven Mark Ford
28

C'est 257 caractères. Pour être précis: NTFS lui-même impose une longueur maximale de nom de fichier de plusieurs milliers de caractères (environ 30'000 quelque chose). Toutefois, Windows impose une longueur maximale de 260 pour le chemin d'accès + nom de fichier. Le dossier lecteur + contient au moins 3 caractères, vous vous retrouvez donc avec 257.

Alphager
la source
21
Incorrect - le terminateur NUL fait partie de MAX_PATH, ce qui vous laisse un chemin maximal de 256 caractères (que vous ne pourrez pas créer en raison de la limite de 255 composants individuels).
snemarch
4
"que vous ne pourrez pas créer en raison de la limite de 255 composants individuels." Incorrect. Nous parlons ici de la longueur maximale du chemin, et non de la longueur maximale des composants de chemin individuels. De plus "Lorsque vous utilisez une API pour créer un répertoire, le chemin spécifié ne peut pas être si long que vous ne pouvez pas ajouter un nom de fichier 8.3 (c'est-à-dire que le nom du répertoire ne peut pas dépasser MAX_PATH moins 12)."
Ludovic Kuty
Ce débat ne se produit que parce que l'API de bas niveau permet la création de noms de fichiers 256 caractères, en supposant que le 256 caractères est nul, mais le fichier devient inaccessible (masqué) aux applications natives, donc généralement pas utile.
Conrad B
1
@ LudovicKuty: en fait, l'OP parlait de la limitation de la longueur du nom de fichier , pas de la longueur du chemin (oui, même dans la révision d'origine, j'ai vérifié). Et il faisait très spécifiquement référence aux limites NTFS et non aux limites du système d'exploitation, d'un sous-système ou d'une API ou d'un cadre particulier.
0xC0000022L
@ 0xC0000022L Oui en effet. Je l'ai mal lu dans la question OP et je me suis concentré sur les commentaires qui parlent de la longueur du nom de fichier et de la longueur du chemin.
Ludovic Kuty
27

Voici ce que dit "l'exception non gérée" sur le framework 4.5 lorsque vous essayez d'enregistrer un fichier avec un nom de fichier long:

Le chemin spécifié, le nom de fichier ou les deux sont trop longs. Le nom de fichier complet doit contenir moins de 260 caractères et le nom du répertoire doit contenir moins de 248 caractères.

capture d'écran

SturmCoder
la source
16

199 sur Windows XP NTFS, je viens de vérifier.

Ce n'est pas de la théorie, mais simplement d'essayer mon ordinateur portable. Il peut y avoir des effets atténuants, mais physiquement, cela ne me permettra pas de l'agrandir.

Y a-t-il un autre paramètre qui limite cela, je me demande? Essayez-le par vous-même.

Colombe
la source
1
Je l'ai confirmé sur ma version de XP, quelle douleur
Julian Young
J'ai fait exactement la même chose sur Windows XP juste pour des rires. J'ai atteint une limite à 200 caractères. Ensuite, je viens de créer un fichier avec 255 fois w, supprimé cela et créé un dossier avec le même nom sur Windows 7 x64. Maintenant, la question est quel est le facteur limitant ici: la version NTFS, le système d'exploitation ou le sous-système ou l'API Win32 dans XP?
0xC0000022L
La limite de 200 caractères semble être dans l'explorateur. D'autres programmes peuvent créer des noms de fichiers plus longs. Il s'agit probablement d'une limite intentionnelle pour sauver l'utilisateur de lui-même. :-)
avl_sweden
13

Selon MSDN , c'est 260 caractères. Il inclut "<NUL>"le caractère nul de terminaison invisible, de sorte que la longueur réelle est de 259.

Mais lisez l'article, c'est un peu plus compliqué.

Kibbee
la source
1
En fait, l'article MSDN référencé indique que le chemin est limité à 260 caractères mais que la longueur du nom de fichier dépend du système de fichiers (mais généralement 255 octets). Cependant, il est possible d'utiliser des "versions Unicode [des fonctions de l'API Windows]" pour augmenter la limite de chemin d'accès à 32 767 octets, mais cette limite est réduite par les fenêtres développant en interne le \\?\ préfixe requis au moment de l'exécution à une longueur non spécifiée. Le chemin d'accès doit rester inférieur à 32 767 octets après cette expansion.
Mikko Rantalainen
13

La longueur dans NTFS est 255. Le NameLengthchamp dans l' $Filenameattribut NTFS est un octet sans décalage; cela donne une plage de 0 à 255.

Le nom de fichier iself peut se trouver dans différents "espaces de noms". Jusqu'à présent, il existe: POSIX, WIN32, DOS et (WIN32DOS - lorsqu'un nom de fichier peut être nativement un nom DOS). (Étant donné que la chaîne a une longueur, elle pourrait contenir \ 0 mais cela entraînerait des problèmes et ne se trouve pas dans les espaces de noms ci-dessus.)

Ainsi, le nom d'un fichier ou d'un répertoire peut contenir jusqu'à 255 caractères. Lorsque vous spécifiez le chemin complet sous Windows, vous devez préfixer le chemin avec \\? \ (Ou utiliser \\? \ UNC \ server \ share pour les chemins UNC) pour marquer ce chemin comme un chemin de longueur étendue (~ 32 000 caractères) . Si votre chemin est plus long, vous devrez définir votre répertoire de travail en cours de route (ugh - effets secondaires dus au paramètre à l'échelle du processus).

Dominik Weber
la source
4

J'ajoute ceci à la réponse approuvée ci-dessus.

POUR ÊTRE CLAIR, la raison pour laquelle les gens pensent qu'il s'agit de 255 à 260 caractères est que c'est tout ce que Windows Explorer prend en charge. Cela entraînera une erreur en faisant quelque chose comme une copie de fichier sur des noms de fichiers plus longs que cela. Cependant, un programme peut lire et écrire des noms de fichiers beaucoup plus longs (c'est ainsi que vous obtenez des longueurs dont Explorer se plaint en premier lieu). La «solution recommandée» de Microsoft dans des situations comme celle-ci consiste à ouvrir le fichier dans le programme d'origine qui l'a écrit et à le renommer.

std''OrgnlDave
la source
J'ai essayé d'enregistrer un fichier au fond d'une hiérarchie de dossiers dépassant définitivement 260+ caractères à partir de la ligne de commande avec vim, mais sans succès.
panny
@panny: les auteurs de Vim n'ont donc pas pris soin d'implémenter des noms de chemin longs. Ce n'est pas Windows à blâmer ni le sous-système Win32 et cela n'a rien à voir avec la limitation de la longueur du nom de fichier pour NTFS à propos de l'OP.
0xC0000022L
3

Selon la nouvelle documentation du SDK Windows (8.0), il semble qu'une nouvelle limite de chemin soit fournie. Il existe un nouvel ensemble de fonctions de gestion de chemin et une définition de PATHCCH_MAX_CCH comme suit:

// max # of characters we support using the "\\?\" syntax
// (0x7FFF + 1 for NULL terminator)
#define PATHCCH_MAX_CCH             0x8000
Cplusminus_is_coming
la source
3
Cependant, l'explorateur Windows 8 (aperçu Win8.1 dans mon cas) ne fonctionne pas avec cette limite et il n'accepte pas les chemins de plus de 259 caractères.
Cplusminus_is_coming
3

Cette partie de la documentation officielle indique clairement qu'il s'agit de 255 caractères Unicode pour NTFS, exFAT et FAT32 et 127 Unicode ou 254 caractères ASCII pour UDF.

En dehors de cela, la longueur maximale du nom de chemin est toujours de 32 760 caractères Unicode, chaque composant de chemin ne dépassant pas 255 caractères.

croasser
la source
Assez proche. Comme je le souligne dans un commentaire sur la réponse acceptée, ce sont 32 767 WCHARéléments. Non, ce n'est pas des "caractères Unicode" (vérifiez votre terminologie Unicode: points de code, caractères etc ...!).
0xC0000022L
-2

238! Je l'ai vérifié sous Win7 32 bits avec le script bat suivant:

set "fname="
for /l %%i in (1, 1, 27) do @call :setname
@echo %fname%
for /l %%i in (1, 1, 100) do @call :check
goto :EOF
:setname
set "fname=%fname%_123456789"
goto :EOF
:check
set "fname=%fname:~0,-1%"
@echo xx>%fname%
if not exist %fname% goto :eof
dir /b
pause
goto :EOF
SzB
la source
Je l'ai vérifié sous Windows 7 avec un programme qui gère correctement les longs chemins. Chaque segment de chemin individuel peut prendre jusqu'à 255 caractères (j'ai utilisé w). Et maintenant?
0xC0000022L
-2

En fait, il est de 256, voir Comparaison des fonctionnalités du système de fichiers, limites .

Pour répéter un message sur http://fixunix.com/microsoft-windows/30758-windows-xp-file-name-length-limit.html

"En supposant que nous parlons de NTFS et non de FAT32, les" 255 caractères pour le chemin + fichier "sont une limitation de l'Explorateur, pas le système de fichiers lui-même. NTFS prend en charge des chemins jusqu'à 32 000 caractères Unicode, avec chaque composant jusqu'à 255 caractères.

L'Explorateur et l'API Windows vous limitent à 260 caractères pour le chemin d'accès, qui incluent la lettre de lecteur, les deux-points, les barres obliques de séparation et un caractère nul de fin. Il est possible de lire un chemin plus long dans Windows si vous le démarrez avec un \\"

Si vous lisez les articles ci-dessus, vous verrez qu'il y a une 5ème chose dont vous pouvez être certain: trouver au moins un utilisateur d'ordinateur obstiné!

fane
la source
4
Non - c'est 255. Le champ NameLength dans l'attribut NTFS $ Filename est un octet sans décalage; cela donne une plage de 0 à 255
Dominik Weber
-2

Je ne peux pas créer un fichier avec le nom + période + extension dans WS 2012 Explorer plus de 224 caractères. Ne tirez pas sur le messager!

Dans le CMD du même serveur, je ne peux pas créer un nom de plus de 235 caractères:

Le système ne peut pas trouver le chemin spécifié.

Le fichier avec un nom de 224 caractères créé dans l'Explorateur ne peut pas être ouvert dans Notepad ++ - il vient juste avec un nouveau fichier à la place.

ajeh
la source
The system cannot find the path specified.n'est pas le même que The specified path, file name, or both are too long.. Je suppose que vous aviez une faute de frappe ou quelque chose. Vous obtenez ce message si vous essayez de créer un fichier dans un chemin qui n'existe pas ou si vous souhaitez vous déplacer dans une direction qui n'existe pas.
Matthias Burger