Dove posso trovare un elenco di caratteri consentiti nei nomi dei file, a seconda del sistema operativo? (ad es. su Linux, il personaggio :
è consentito nei nomi di file, ma non su Windows)
Dove posso trovare un elenco di caratteri consentiti nei nomi dei file, a seconda del sistema operativo? (ad es. su Linux, il personaggio :
è consentito nei nomi di file, ma non su Windows)
Risposte:
Dovresti iniziare con la pagina Nome file Wikipedia . Ha una tabella di dimensioni decenti ( Confronto delle limitazioni del nome file ), che elenca i caratteri riservati per molti file system.
Ha anche una pletora di altre informazioni su ciascun file system, inclusi i nomi di file riservati come CON
in MS-DOS. Ho già detto che solo perché mi è stato morso da che una volta, quando ho accorciato un include file da const.h
a con.h
e passato mezz'ora per capire il motivo per cui il compilatore appeso.
Risulta che le estensioni ignorate da DOS per i dispositivi sono con.h
esattamente le stesse con
della console di input (il che significa, ovviamente, che il compilatore mi stava aspettando di digitare il file di intestazione prima che potesse continuare).
POSIX "Fully portable filenames"
voce, che elenca questi:A–Z a–z 0–9 . _ -
OK, quindi guardando il Confronto dei file system se ti preoccupi solo dei file system dei giocatori principali:
NUL
, \
, /
, :
, *
, "
, <
, >
, |
. Inoltre, nessun carattere di spazio all'inizio o alla fine e nessun punto alla fine .:
o/
NUL
o/
così qualsiasi byte, tranne NUL
, \
, /
, :
, *
, "
, <
, >
, |
e non si può avere file / cartelle chiamare .
o ..
e nessun caratteri di controllo (ovviamente).
/
. Windows non consente la barra rovesciata e alcune stringhe (ad es CON
.).
:
s nei loro nomi.
Per essere più precisi su Mac OS X (ora chiamato MacOS) /
nel Finder viene interpretato :
nel file system Unix.
Ciò è stato fatto per compatibilità con le versioni precedenti quando Apple è passata dal Mac OS classico.
È legittimo utilizzare a /
in un nome di file nel Finder, guardando lo stesso file nel terminale che verrà visualizzato con a :
.
E funziona anche al contrario: non è possibile utilizzare a /
in un nome di file con il terminale, ma a :
è OK e verrà visualizzato come un/
nel Finder.
Alcune applicazioni possono essere più restrittive e vietare entrambi i caratteri per evitare confusione o perché mantengono la logica dal precedente Mac OS classico o per la compatibilità dei nomi tra piattaforme.
Per i nomi di file "English local", funziona bene. Lo sto usando per disinfettare i nomi dei file caricati. Il nome del file non è pensato per essere collegato a nulla sul disco, è per quando il file viene scaricato, quindi non ci sono controlli del percorso.
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
Fondamentalmente rimuove tutti i caratteri non stampabili e riservati per Windows e altri sistemi operativi. È possibile estendere facilmente il modello per supportare altre impostazioni locali e funzionalità.
Ecco il codice per pulire il nome del file in Python.
import unicodedata
def clean_name(name, replace_space_with=None):
"""
Remove invalid file name chars from the specified name
:param name: the file name
:param replace_space_with: if not none replace space with this string
:return: a valid name for Win/Mac/Linux
"""
# ref: https://en.wikipedia.org/wiki/Filename
# ref: /programming/4814040/allowed-characters-in-filename
# No control chars, no: /, \, ?, %, *, :, |, ", <, >
# remove control chars
name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')
cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
if replace_space_with is not None:
return cleaned_name.replace(' ', replace_space_with)
return cleaned_name
:return: a valid name for Win/Mac/Linux
non è vero in tutte le circostanze.