Manteniamolo semplice e rispondiamo prima alla domanda.
-
I caratteri ASCII stampabili vietati sono:
-
Linux/Unix:
/ (forward slash)
-
Finestre:
< (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)
-
-
Caratteri non stampabili
Se i tuoi dati provengono da una fonte che consentirebbe caratteri non stampabili, allora c'è altro da controllare.
-
Linux/Unix:
0 (NULL byte)
-
Finestre:
0-31 (ASCII control characters)
Nota: Sebbene sia legale nei file system Linux/Unix creare file con caratteri di controllo nel nome del file, potrebbe essere un incubo per gli utenti gestire tali file.
-
-
Nomi file riservati
I seguenti nomi di file sono riservati:
-
Finestre:
CON, PRN, AUX, NUL COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
(sia da soli che con estensioni di file arbitrarie, ad esempio
LPT1.txt
).
-
-
Altre regole
-
Finestre:
I nomi dei file non possono terminare con uno spazio o un punto.
-
Una "guida completa" dei caratteri dei nomi di file proibiti non funzionerà su Windows perché riserva nomi di file e caratteri. Sì, caratteri come *
"
?
e altri sono vietati, ma esiste un numero infinito di nomi composti solo da caratteri validi che sono vietati. Ad esempio, spazi e punti sono caratteri validi per i nomi dei file, ma i nomi composti solo da questi caratteri sono vietati.
Windows non distingue tra caratteri maiuscoli e minuscoli, quindi non puoi creare una cartella denominata A
se uno si chiama a
esiste già. Nomi peggiori, apparentemente permessi come PRN
e CON
, e molti altri, sono riservati e non consentiti. Windows ha anche diverse limitazioni di lunghezza; un nome file valido in una cartella può diventare non valido se spostato in un'altra cartella. Le regole per la denominazione di file e cartelle si trovano nei documenti Microsoft.
In generale, non è possibile utilizzare testo generato dall'utente per creare nomi di directory di Windows. Se vuoi consentire agli utenti di nominare ciò che vogliono, devi creare nomi sicuri come A
, AB
, A2
et al., memorizza i nomi generati dall'utente e i loro equivalenti di percorso in un file di dati dell'applicazione ed esegue la mappatura del percorso nella tua applicazione.
Se è assolutamente necessario consentire i nomi di cartella generati dall'utente, l'unico modo per stabilire se non sono validi è rilevare le eccezioni e presumere che il nome non sia valido. Anche questo è irto di pericoli, poiché le eccezioni lanciate per accesso negato, unità offline e spazio su disco insufficiente si sovrappongono a quelle che possono essere lanciate per nomi non validi. Stai aprendo un enorme barattolo di dolore.
Sotto Linux e altri sistemi correlati a Unix, ci sono solo due caratteri che non possono apparire nel nome di un file o di una directory, e questi sono NUL '\0'
e barra '/'
. La barra, ovviamente, può apparire in un nome di percorso, separando i componenti della directory.
Si dice che Steven Bourne (di fama 'shell') avesse una directory contenente 254 file, uno per ogni singola lettera (codice carattere) che può apparire in un nome di file (escluso /
, '\0'
; il nome .
era la directory corrente, ovviamente). È stato utilizzato per testare la shell Bourne e ha sistematicamente devastato programmi incauti come i programmi di backup.
Altre persone hanno coperto le regole di Windows.
Tieni presente che MacOS X ha un file system senza distinzione tra maiuscole e minuscole.
Sono stati Kernighan e Pike in The Practice of Programming a dirlo nel Capitolo 6, Testing, §6.5 Stress Tests:
Quando Steve Bourne stava scrivendo la sua shell Unix (che divenne nota come shell Bourne), creò una directory di 254 file con nomi di un carattere, uno per ogni valore di byte tranne
'\0'
e barra, i due caratteri che non possono comparire nei nomi dei file Unix. Ha usato quella directory per tutti i tipi di test di corrispondenza dei modelli e tokenizzazione. (La directory di test è stata ovviamente creata da un programma.) Per anni in seguito, quella directory è stata la rovina dei programmi di file-tree-walking; li ha messi alla prova fino alla distruzione.