Pourquoi ne puis-je pas utiliser un point d’interrogation pour nommer mes fichiers sous Windows ?


Les autres réponses à cette question sont erronées car elles confondent les limitations d'un sous-système de programmation (Win32) avec ce que le système d'exploitation autorise.

Ajoutant une complication à cela, des systèmes de fichiers spécifiques peuvent imposer des restrictions supplémentaires. Cependant, NTFS autorise l'utilisation de ? comme caractère de nom de fichier. Cela est dû au fait que NTFS a toujours pris en charge le nommage compatible POSIX et que ? est considéré comme un caractère valide sous POSIX.


FAT est plus restrictif et vous pouvez voir la liste définitive des caractères que FAT n'autorise pas (routine FsRtlIsFatDbcsLegal). Il n'est pas raisonnable de confondre les restrictions de la FAT avec des restrictions plus larges du système d'exploitation - après tout, Linux prend en charge la FAT et nous ne soutiendrions pas que Linux est restreint sur la simple base d'un système de fichiers.

Si vous voulez utiliser ? pour nommer un fichier sous Windows, vous pouvez le faire via les API Win32 (fonction CreateFile) en utilisant l'option FILE_FLAG_POSIX_SEMANTICS - documentée sur la même page que j'ai précédemment référencée.

L'autre façon (et la façon dont je le fais habituellement) est d'utiliser l'appel API natif. NtCreateFile. Si vous voulez également avoir la sensibilité à la casse, ne définissez pas le bit OBJ_CASE_INSENSITIVE lorsque vous appelez la macro InitializeObjectAttributes pour configurer la structure des attributs de l'objet.

Il y a une astuce gênante en ce qui concerne cet appel - il y a un paramètre global du système qui remplace la sensibilité à la casse et qui est par défaut insensible à la casse. Il y a un bon article ici sur la façon de changer ce comportement.

Il peut également être activé à l'intérieur du noyau via un pilote de filtre de système de fichiers. Je ne suis pas sûr de savoir laquelle de ces approches est utilisée par la WSL. À l'heure actuelle, le moyen le plus simple de créer un fichier à partir d'une ligne de commande pour démontrer que vous pouvez créer des fichiers avec le ? est simplement de lancer bash et d'en créer un. Ensuite, vous pouvez aller le chercher dans le sous-répertoire AppDatalocallxss sous votre répertoire personnel (c'est là que WSL stocke ses trucs).

Si vous voulez voir comment FAT gère les choses, le code est ici. Le code de NTFS n'est pas disponible publiquement, mais il n'a pas l'héritage DOS à supporter et la conformité POSIX était une exigence du premier jour pour lui.

.