Dozwolone znaki w nazwie pliku

139

Gdzie mogę znaleźć listę dozwolonych znaków w nazwach plików, w zależności od systemu operacyjnego? (np. w systemie Linux znak :jest dozwolony w nazwach plików, ale nie w systemie Windows)

Python dude
źródło
NET zapewnia te informacje dla systemu Windows.
leppie
8
@kreker pamiętaj, że Twoje pytanie dotyczy Androida
congusbongus

Odpowiedzi:

107

Powinieneś zacząć od strony Nazwa pliku Wikipedii . Ma przyzwoitą tabelę ( porównanie ograniczeń nazw plików ), zawierającą znaki zastrzeżone dla wielu systemów plików.

Zawiera również mnóstwo innych informacji o każdym systemie plików, w tym zastrzeżone nazwy plików, takie jak CONw systemie MS-DOS. Wspominam o tym tylko dlatego, że raz ugryzło mnie to, kiedy skróciłem plik dołączania z const.hdo con.hi spędziłem pół godziny na zastanawianiu się, dlaczego kompilator się zawiesił.

Okazuje się DOS ignorowane rozszerzeń dla urządzeń, tak aby con.hbył dokładnie taki sam jak conkonsola wejściowego (czyli, oczywiście, kompilator czekał na mnie wpisać w pliku nagłówkowym, zanim będzie kontynuować).

paxdiablo
źródło
4
Uważam, że strona Wikipedii jest nieco niejasna i myląca, np. „Niektóre systemy operacyjne zabraniają niektórych określonych znaków ...”. Właściwie szukam pełnej tabeli, która zawiera listę wszystkich dozwolonych i niedozwolonych znaków.
Python dude
7
@python, nie patrz na tę tabelę, spójrz na dużą, honkin ', znajdującą się pod nią (zatytułowaną „Porównanie ograniczeń nazw plików”). To nie jest tak niejasne w treści.
paxdiablo
52
Prawdopodobnie wystarczy spojrzeć na POSIX "Fully portable filenames"wpis, który wymienia te:A–Z a–z 0–9 . _ -
Vladimir Kornea.
1
@VladimirKornea thanks! Linki: pubs.opengroup.org/onlinepubs/9699919799/basedefs/ ... || pubs.opengroup.org/onlinepubs/9699919799/basedefs/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CpILL Jest więcej systemów operacyjnych niż tylko Windows, OSX i Linux ... niektóre mają bardzo proste systemy plików.
eleganckie kości
33

OK, więc patrząc na Porównanie systemów plików, jeśli zależy Ci tylko na systemach plików głównych odtwarzaczy:

więc każdy bajt z wyjątkiem NUL, \, /, :, *, ", <, >, |i nie można mieć pliki / foldery zadzwonić .lub ..nie ma żadnych znaków sterujących (oczywiście).

CpILL
źródło
7
To nie jest poprawne. Linux nie pozwala /. Windows nie zezwala na lewy ukośnik i niektóre ciągi znaków (np CON.).
kgadek
7
tak, stąd powiedziałem z wyjątkiem .
CpILL
2
Na Macu (z systemem HFS +) mogę tworzyć pliki ze :s w nazwie.
erwaman
To nie jest poprawne. Zobacz tę odpowiedź, aby uzyskać więcej znaków, na które system Windows nie zezwala.
mbomb007
Windows również nie pozwala na sterowanie znakami (ale Mac tak robi, poza NUL)
Thomas Tempelmann
23

W systemie operacyjnym Windows utwórz plik i nadaj mu nieprawidłowy znak, taki jak \w nazwie pliku. W rezultacie otrzymasz wyskakujące okienko ze wszystkimi nieprawidłowymi znakami w nazwie pliku.

wprowadź opis obrazu tutaj

Devid
źródło
5

Mówiąc dokładniej, Mac OS X (obecnie nazywany MacOS) /w Finderze jest interpretowany :w systemie plików Unix.

Dokonano tego w celu zapewnienia zgodności z poprzednimi wersjami, gdy Apple przeniósł się z klasycznego Mac OS.

Prawidłowe jest użycie /w nazwie pliku w Finderze, patrząc na ten sam plik w terminalu, który pojawi się z rozszerzeniem :.

Działa to również w drugą stronę: nie możesz użyć a /w nazwie pliku z terminalem, ale a :jest OK i pojawi się jako a /w Finderze.

Niektóre aplikacje mogą być bardziej restrykcyjne i zabraniać obu znaków, aby uniknąć nieporozumień lub dlatego, że zachowały logikę z poprzedniego klasycznego systemu Mac OS lub ze względu na zgodność nazw między platformami.

Jean Létourneau
źródło
0

W przypadku nazw plików „angielskie locale” działa to ładnie. Używam tego do odkażania przesłanych nazw plików. Nazwa pliku nie ma być powiązana z czymkolwiek na dysku, służy do pobierania pliku, dlatego nie ma sprawdzania ścieżki.

$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);

Zasadniczo usuwa wszystkie niedrukowalne i zastrzeżone znaki dla systemu Windows i innych systemów operacyjnych. Możesz łatwo rozszerzyć wzorzec, aby obsługiwał inne lokalizacje i funkcje.

TheRealChx101
źródło
-1

Oto kod do czyszczenia nazwy pliku w Pythonie.

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
Du D.
źródło
2
Kod nie sprawdza nieprawidłowych (zarezerwowanych) nazw i nie sprawdza również nieprawidłowego znaku w obszarze replace_space_with. Długość nazwy pliku jest poza zakresem. Tak więc :return: a valid name for Win/Mac/Linuxnie jest prawdą we wszystkich okolicznościach.
potwierdzenie z