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)
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)
Odpowiedzi:
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 CON
w systemie MS-DOS. Wspominam o tym tylko dlatego, że raz ugryzło mnie to, kiedy skróciłem plik dołączania z const.h
do con.h
i spędziłem pół godziny na zastanawianiu się, dlaczego kompilator się zawiesił.
Okazuje się DOS ignorowane rozszerzeń dla urządzeń, tak aby con.h
był dokładnie taki sam jak con
konsola wejściowego (czyli, oczywiście, kompilator czekał na mnie wpisać w pliku nagłówkowym, zanim będzie kontynuować).
POSIX "Fully portable filenames"
wpis, który wymienia te:A–Z a–z 0–9 . _ -
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:
NUL
, \
, /
, :
, *
, "
, <
, >
, |
. Poza tym nie ma spacji na początku ani na końcu ani kropki na końcu .:
lub/
NUL
lub/
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).
/
. Windows nie zezwala na lewy ukośnik i niektóre ciągi znaków (np CON
.).
:
s w nazwie.
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.
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.
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
:return: a valid name for Win/Mac/Linux
nie jest prawdą we wszystkich okolicznościach.