Caratteri consentiti nel nome file


139

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)


.NET fornisce tali informazioni per Windows.
Leppie,


8
@Kreker nota che la tua domanda riguarda Android
congusbongus,


Risposte:


107

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 CONin MS-DOS. Ho già detto che solo perché mi è stato morso da che una volta, quando ho accorciato un include file da const.ha con.he passato mezz'ora per capire il motivo per cui il compilatore appeso.

Risulta che le estensioni ignorate da DOS per i dispositivi sono con.hesattamente le stesse condella console di input (il che significa, ovviamente, che il compilatore mi stava aspettando di digitare il file di intestazione prima che potesse continuare).


4
Trovo la pagina di Wikipedia un po 'vaga e confusa, ad esempio "Alcuni sistemi operativi vietano alcuni caratteri particolari ...". In realtà sto cercando una tabella completa che elenca tutti i caratteri consentiti e non consentiti.
Python Dude,

7
@python, non guardare quella tabella, guarda quella più grande sotto di essa (intitolata "Confronto delle limitazioni del nome del file"). Ecco , non così vago nel suo contenuto.
paxdiablo,

52
Probabilmente tutto ciò che serve è guardare la POSIX "Fully portable filenames"voce, che elenca questi:A–Z a–z 0–9 . _ -
Vladimir Kornea,


1
@CpILL Esistono più sistemi operativi oltre a Windows, OSX e Linux ... alcuni hanno file system molto semplici.
eleganti dadi

33

OK, quindi guardando il Confronto dei file system se ti preoccupi solo dei file system dei giocatori principali:

così qualsiasi byte, tranne NUL, \, /, :, *, ", <, >, |e non si può avere file / cartelle chiamare .o ..e nessun caratteri di controllo (ovviamente).


7
Questo non è corretto Linux non lo consente /. Windows non consente la barra rovesciata e alcune stringhe (ad es CON.).
kgadek,

7
sì, quindi ho detto tranne .
CpILL,

2
Su Mac (con HFS +), sono in grado di creare file con :s nei loro nomi.
Erwaman,

Questo non è corretto Vedi questa risposta per più caratteri che Windows non consente.
mbomb007,

Windows non consente alcun carattere di controllo, neanche (ma il Mac lo fa, tranne NUL)
Thomas Tempelmann,

23

Sul sistema operativo Windows, crea un file e assegnagli un carattere non valido come \nel nome del file. Di conseguenza otterrai un popup con tutti i caratteri non validi in un nome file.

inserisci qui la descrizione dell'immagine


5

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.


0

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à.


-1

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

2
Il codice non verifica la presenza di nomi (riservati) non validi e non verifica la presenza di caratteri non validi anche in replace_space_with. La lunghezza del nome del file non rientra nell'ambito. Quindi, :return: a valid name for Win/Mac/Linuxnon è vero in tutte le circostanze.
ack
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.