Pojďme to zjednodušit a nejprve odpovězte na otázku.
-
Zakázané tisknutelné znaky ASCII jsou:
-
Linux/Unix:
/ (forward slash)
-
Windows:
< (less than) > (greater than) : (colon - sometimes works, but is actually NTFS Alternate Data Streams) " (double quote) / (forward slash) \ (backslash) | (vertical bar or pipe) ? (question mark) * (asterisk)
-
-
Netisknutelné znaky
Pokud vaše data pocházejí ze zdroje, který povoluje netisknutelné znaky, pak je třeba zkontrolovat více.
-
Linux/Unix:
0 (NULL byte)
-
Windows:
0-31 (ASCII control characters)
Poznámka: I když je v souborových systémech Linux/Unix legální vytvářet soubory s řídicími znaky v názvu souboru, pro uživatele může být noční můra zabývat se takovými soubory.
-
-
Vyhrazené názvy souborů
Následující názvy souborů jsou vyhrazeny:
-
Windows:
CON, PRN, AUX, NUL COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
(jak samostatně, tak s libovolnými příponami souborů, např.
LPT1.txt
).
-
-
Další pravidla
-
Windows:
Názvy souborů nemohou končit mezerou ani tečkou.
-
„Komplexní průvodce“ zakázanými znaky souborů nebude ve Windows fungovat, protože si vyhrazuje názvy souborů i znaky. Ano, znaky jako *
"
?
a další jsou zakázány, ale existuje nekonečné množství jmen složených pouze z platných znaků, které jsou zakázané. Například mezery a tečky jsou platné znaky názvu souboru, ale názvy složené pouze z těchto znaků jsou zakázány.
Windows nerozlišuje mezi velkými a malými písmeny, takže nemůžete vytvořit složku s názvem A
pokud se jmenuje a
již existuje. Horší, zdánlivě povolená jména jako PRN
a CON
, a mnoho dalších, jsou vyhrazeny a nejsou povoleny. Windows má také několik omezení délky; název souboru platný v jedné složce se může stát neplatným, pokud se přesune do jiné složky. Pravidla pro pojmenovávání souborů a složek jsou v dokumentech Microsoft.
Obecně nemůžete k vytváření názvů adresářů Windows používat text generovaný uživatelem. Pokud chcete uživatelům umožnit pojmenovat cokoli chtějí, musíte vytvořit bezpečné názvy jako A
, AB
, A2
et al., ukládat uživatelsky vygenerovaná jména a jejich ekvivalenty cest do datového souboru aplikace a provádět mapování cest ve vaší aplikaci.
Pokud bezpodmínečně musíte povolit názvy složek generované uživateli, jediným způsobem, jak zjistit, zda jsou neplatné, je zachytit výjimky a předpokládat, že název je neplatný. I to je plné nebezpečí, protože výjimky pro odepřený přístup, offline disky a nedostatek místa na disku se překrývají s těmi, které mohou být vyvolány pro neplatná jména. Otevíráte jednu obrovskou plechovku bolesti.
V Linuxu a dalších unixových systémech se v názvu souboru nebo adresáře nemohou objevit pouze dva znaky, a to NUL '\0'
a lomítko '/'
. Lomítko se samozřejmě může objevit v názvu cesty, oddělující složky adresáře.
Říká se, že Steven Bourne (známý „skořápka“) měl adresář obsahující 254 souborů, jeden na každé písmeno (znakový kód), které se může objevit v názvu souboru (kromě /
, '\0'
; název .
byl samozřejmě aktuální adresář). Byl použit k testování Bourne shellu a rutinně způsobil zmatek na neopatrných programech, jako jsou zálohovací programy.
Jiní lidé se zabývali pravidly Windows.
Všimněte si, že MacOS X má systém souborů bez ohledu na velikost písmen.
Byl to Kernighan &Pike v The Practice of Programming, kdo řekl tolik v kapitole 6, Testování, §6.5 Zátěžové testy:
Když Steve Bourne psal svůj unixový shell (který začal být známý jako Bourne shell), vytvořil adresář 254 souborů s jednoznakovými jmény, jeden pro každou hodnotu bajtu kromě
'\0'
a lomítko, dva znaky, které se nemohou objevit v názvech souborů Unix. Použil tento adresář pro všechny druhy testů porovnávání vzorů a tokenizace. (Testovací adresář byl samozřejmě vytvořen programem.) Po mnoho let byl tento adresář zkázou programů pro procházení stromem souborů; testovalo je to k destrukci.