Wiem, że / jest nielegalne w systemie Linux, a następujące są nielegalne w systemie Windows (myślę) *
.
"
/
\
[
]
:
;
|
,
Czego jeszcze mi brakuje?
Potrzebuję jednak kompleksowego przewodnika uwzględniającego znaki dwubajtowe. Łączenie się z zewnętrznymi zasobami jest dla mnie w porządku.
Najpierw muszę utworzyć katalog w systemie plików, używając nazwy, która może zawierać niedozwolone znaki, więc planuję zastąpić te znaki podkreśleniami. Następnie muszę napisać ten katalog i jego zawartość do pliku zip (przy użyciu Java), więc wszelkie dodatkowe porady dotyczące nazw katalogów zip będą mile widziane.
echo abc > "ab.;,=[1]"
Odpowiedzi:
„Kompleksowy przewodnik” dotyczący zabronionych znaków nazw plików nie będzie działał w systemie Windows, ponieważ rezerwuje nazwy plików i znaki. Tak, znaki takie jak
*
"
?
i inne są zabronione, ale istnieje nieskończona liczba nazw złożonych tylko z prawidłowych znaków, które są zabronione. Na przykład spacje i kropki są poprawnymi znakami nazw plików, ale nazwy złożone tylko z tych znaków są zabronione.System Windows nie rozróżnia wielkich i małych liter, więc nie można utworzyć folderu o nazwie,
A
jeśli takia
już istnieje. Gorsze, pozornie dozwolony nazwy jakPRN
iCON
, i wiele innych, są zastrzeżone i nie wolno. System Windows ma również kilka ograniczeń długości; nazwa pliku ważna w jednym folderze może stać się niepoprawna, jeśli zostanie przeniesiona do innego folderu. Reguły nazewnictwa plików i folderów znajdują się w dokumentach Microsoft.Zasadniczo nie można używać tekstu generowanego przez użytkownika do tworzenia nazw katalogów Windows. Jeśli chcesz, aby umożliwić użytkownikom nazwa cokolwiek chcą, trzeba stworzyć bezpieczne nazwiska jak
A
,AB
,A2
et al., Nazwy przechowywać generowane przez użytkownika i ich ekwiwalenty ścieżka w pliku danych aplikacji i wykonać mapowanie ścieżki w aplikacji.Jeśli absolutnie musisz zezwolić na nazwy folderów generowane przez użytkowników, jedynym sposobem na stwierdzenie, czy są one nieprawidłowe, jest wychwycenie wyjątków i założenie, że nazwa jest nieprawidłowa. Nawet to jest obarczone niebezpieczeństwem, ponieważ wyjątki zgłaszane w przypadku odmowy dostępu, dyski offline i brak miejsca na dysku pokrywają się z wyjątkami, które można wyrzucić w przypadku nieprawidłowych nazw. Otwierasz jedną wielką paczkę krzywdy.
źródło
A.txt
jest nieprawidłowa, ponieważa.TXT
może istnieć.COPY CON PRN
oznacza odczyt z wejścia klawiatury lub możliwy standard i skopiowanie go na drukarkę. Nie jestem pewien, czy nadal obowiązuje w nowoczesnych oknach, ale na pewno było to przez długi czas. W dawnych czasach można było go używać do pisania tekstu, a drukarka mozaikowa po prostu go drukowała.Uprośćmy to i najpierw odpowiedzmy na pytanie.
Niedozwolonymi drukowanymi znakami ASCII są:
Linux / Unix:
Windows:
Znaki niedrukowalne
Jeśli Twoje dane pochodzą ze źródła, które zezwala na znaki niedrukowalne, jest więcej do sprawdzenia.
Linux / Unix:
Windows:
Uwaga: Chociaż w systemach plików Linux / Unix dozwolone jest tworzenie plików ze znakami kontrolnymi w nazwie pliku, użytkownicy mogą mieć koszmar z takimi plikami .
Zarezerwowane nazwy plików
Zastrzeżone są następujące nazwy plików:
Windows:
(zarówno samodzielnie, jak i z dowolnymi rozszerzeniami plików, np
LPT1.txt
.).Inne zasady
Windows:
Nazwy plików nie mogą kończyć się spacją ani kropką.
źródło
W Linuksie i innych systemach związanych z Uniksem istnieją tylko dwa znaki, które nie mogą pojawić się w nazwie pliku lub katalogu, a są to NUL
'\0'
i ukośnik'/'
. Ukośnik może oczywiście występować w nazwie ścieżki, oddzielając składniki katalogu.Plotka 1 głosi, że Steven Bourne (z „shell” FAME) miał katalog zawierający 254 plików, po jednym dla każdej litery (kod znaków), które mogą pojawić się w nazwie pliku (z wyłączeniem
/
,'\0'
; nazwa.
był obecny katalog, oczywiście ). Służył do testowania powłoki Bourne'a i rutynowo dokonywał spustoszenia w nieostrożnych programach, takich jak programy do tworzenia kopii zapasowych.Inne osoby przestrzegały zasad systemu Windows.
Pamiętaj, że MacOS X ma system plików bez rozróżniania wielkości liter.
1 To Kernighan i Pike w praktyce programowania powiedział tyle samo w rozdziale 6, Testowanie, §6.5 Testy warunków skrajnych:
Należy pamiętać, że katalog musi być zawarta wpisy
.
i..
tak było wzięte stanowią 253 pliki (katalogi i 2) lub 255 wpisów nazw, zamiast 254 plików. Nie wpływa to na skuteczność anegdoty ani na dokładne testowanie, które opisuje.źródło
/
nazwę w nazwie. To spowodowało pewne problemy, ponieważ utworzył nowy katalog ze schematem w.PATH
zmiennej Unix , ponieważ dwukropek jest używany jako separator (średnik w systemie Windows). Tak więc programy w takim katalogu muszą być albo uruchamiane ze ścieżką, która określa, gdzie to jest (może być względne lub bezwzględne), albo musisz znajdować się w tym katalogu i mieć kropkę (.
bieżący katalog)PATH
, która jest powszechnie uważana za niebezpieczne.Zamiast tworzyć czarną listę znaków, możesz użyć białej listy . Biorąc wszystko pod uwagę, zakres znaków, które mają sens w kontekście nazwy pliku lub katalogu, jest dość krótki i chyba że masz jakieś bardzo specyficzne wymagania dotyczące nazewnictwa, twoi użytkownicy nie zniosą go przeciwko twojej aplikacji, jeśli nie będą mogli użyć całej tabeli ASCII.
Nie rozwiązuje to problemu zarezerwowanych nazw w docelowym systemie plików, ale dzięki białej liście łatwiej jest zmniejszyć ryzyko u źródła.
W tym duchu jest to szereg znaków, które można uznać za bezpieczne:
I wszelkie dodatkowe bezpieczne postacie, na które chcesz zezwolić. Poza tym musisz egzekwować dodatkowe zasady dotyczące spacji i kropek . Zazwyczaj wystarcza to:
To już pozwala na dość złożone i bezsensowne nazwy. Na przykład te nazwy byłyby możliwe przy tych regułach i byłyby prawidłowymi nazwami plików w systemie Windows / Linux:
A...........ext
B -.- .ext
W istocie, nawet przy tak małej liczbie znaków na białej liście, powinieneś nadal decydować, co naprawdę ma sens, i odpowiednio zweryfikować / dostosować nazwę. W jednej z moich aplikacji użyłem tych samych reguł, co powyżej, ale usunąłem wszelkie zduplikowane kropki i spacje.
źródło
Najłatwiejszym sposobem, aby system Windows poinformował cię o odpowiedzi, jest próba zmiany nazwy pliku za pomocą Eksploratora i wpisanie / dla nowej nazwy. Windows wyświetli okno komunikatu z listą niedozwolonych znaków.
https://support.microsoft.com/en-us/kb/177506
źródło
Cóż, jeśli tylko w celach badawczych, najlepszym rozwiązaniem jest przejrzenie tego wpisu w Wikipedii na temat nazw plików .
Jeśli chcesz napisać funkcję przenośną do sprawdzania poprawności danych wejściowych użytkownika i tworzenia na podstawie tych nazw plików, krótka odpowiedź brzmi „ nie” . Rzuć okiem na przenośny moduł, taki jak Perl's File :: Spec, aby rzucić okiem na wszystkie przeskoki potrzebne do wykonania tak „prostego” zadania.
źródło
W systemie Windows można to sprawdzić za pomocą programu PowerShell
Aby wyświetlić kody UTF-8, możesz je przekonwertować
źródło
W systemie Windows 10 (2019) następujące znaki są zabronione przez błąd podczas próby ich wpisania:
źródło
Oto implementacja ac # dla okien oparta na odpowiedzi Christophera Oezbka
Zostało to bardziej skomplikowane przez wartość logiczną zawieraFolder, ale mam nadzieję, że obejmuje wszystko
źródło
StringBuilder
początkową wartość pojemności? 2. Dlaczego dodałeś 12 do długościfilename
? 3. Czy 12 zostało wybranych arbitralnie, czy też kryje się za tym numer?Według stanu na 18.04.2017 wśród odpowiedzi na ten temat nie ma prostej czarnej lub białej listy znaków i nazw plików - i jest wiele odpowiedzi.
Najlepszą propozycją, jaką mogłem wymyślić, było zezwolenie użytkownikowi na nazwanie pliku w dowolny sposób. Korzystając z procedury obsługi błędów, gdy aplikacja próbuje zapisać plik, wychwyć wszelkie wyjątki, załóż, że nazwa jest winna (oczywiście po upewnieniu się, że ścieżka zapisywania również była poprawna) i poproś użytkownika o podanie nowej nazwy pliku. Aby uzyskać najlepsze wyniki, umieść tę procedurę sprawdzania w pętli, która będzie kontynuowana, dopóki użytkownik nie zrobi tego poprawnie lub zrezygnuje. Działa najlepiej dla mnie (przynajmniej w VBA).
źródło
Chociaż mogą być jedynymi niedozwolonymi znakami uniksowymi
/
iNULL
chociaż należy wziąć pod uwagę interpretację wiersza poleceń.Na przykład, chociaż nazwanie pliku
1>&2
lub2>&1
w systemie Unix może być legalne , takie nazwy plików mogą być błędnie interpretowane, gdy są używane w wierszu poleceń.Podobnie może być możliwe nazwanie pliku
$PATH
, ale przy próbie dostępu do niego z wiersza poleceń powłoka przełoży się$PATH
na wartość zmiennej.źródło
$'myvalueis'
, ex:$ echo 'hi' > $'2>&1'
,cat 2\>\&1
„hi”Trudności ze zdefiniowaniem, co jest legalne, a które nie, zostały już zaadresowane i zasugerowano białe listy . Ale system Windows obsługuje znaki większe niż 8-bitowe . Wikipedia stwierdza , że (na przykład)
Dlatego chcę przedstawić znacznie bardziej liberalne podejście przy użyciu znaków Unicode zamiast „nielegalnych”. Znalazłem wynik w moim porównywalnym przypadku użycia o wiele bardziej czytelnym. Poszukaj na przykład tego bloku . Ponadto możesz nawet przywrócić z tego oryginalną zawartość. Możliwe wybory i badania znajdują się na poniższej liście:
U+002A * ASTERISK
) możesz użyć jednego z wielu wymienionych, na przykładU+2217 ∗ (ASTERISK OPERATOR)
lubFull Width Asterisk U+FF0A *
⋅ U+22C5 dot operator
“ U+201C english leftdoublequotemark
(alternatywy patrz tutaj )/ SOLIDUS U+002F
) możesz użyć∕ DIVISION SLASH U+2215
(inne tutaj )\ U+005C Reverse solidus
) możesz użyć⧵ U+29F5 Reverse solidus operator
( więcej )U+005B Left square bracket
) i ](U+005D Right square bracket
) możesz użyć na przykładU+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
iU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
( stąd więcej możliwości tutaj )U+2236 ∶ RATIO (for mathematical usage)
lubU+A789 ꞉ MODIFIER LETTER COLON
(patrz dwukropek (litera) , czasem używany w nazwach plików Windows, ponieważ jest identyczny z dwukropkiem w czcionce Segoe UI używanej do nazw plików. Sam dwukropek jest niedozwolony) (patrz tutaj )U+037E ; GREEK QUESTION MARK
(patrz tutaj )U+0964 । DEVANAGARI DANDA
,U+2223 ∣ DIVIDES
lubU+01C0 ǀ LATIN LETTER DENTAL CLICK
( Wikipedia ). Również znaki do rysowania w ramkach zawierają różne inne opcje., U+002C COMMA
) możesz na przykład użyć‚ U+201A SINGLE LOW-9 QUOTATION MARK
(patrz tutaj )U+003F ? QUESTION MARK
) są to dobrzy kandydaci:U+FF1F ? FULLWIDTH QUESTION MARK
lubU+FE56 ﹖ SMALL QUESTION MARK
(z jego reszty dwa kolejne z Dingbats Block , szukać „pytanie”)źródło
Podczas tworzenia skrótów internetowych w systemie Windows, aby utworzyć nazwę pliku, pomija niedozwolone znaki, z wyjątkiem ukośnika, który jest konwertowany na minus.
źródło
W powłokach uniksowych możesz cytować prawie każdą postać w pojedynczym cudzysłowie
'
. Z wyjątkiem samego pojedynczego cudzysłowu i nie można wyrazić znaków kontrolnych, ponieważ\
nie jest rozwinięty. Dostęp do samego cytatu z cytowanego ciągu jest możliwy, ponieważ można łączyć łańcuchy z pojedynczymi i podwójnymi cudzysłowami, podobnie jak w'I'"'"'m'
przypadku dostępu do pliku o nazwie"I'm"
(tutaj można również podwójnego cudzysłowu).Dlatego należy unikać wszystkich znaków kontrolnych, ponieważ są one zbyt trudne do wprowadzenia do powłoki. Reszta jest nadal zabawna, zwłaszcza pliki zaczynające się od myślnika, ponieważ większość poleceń odczytuje je jako opcje, chyba że masz dwa myślniki
--
wcześniej lub podasz je za pomocą./
, co również ukrywa początek-
.Jeśli chcesz być miły, nie używaj żadnych znaków używanych przez powłokę i typowe polecenia jako elementy składniowe, czasem zależne od pozycji, więc np. Możesz nadal używać
-
, ale nie jako pierwszego znaku; podobnie.
, możesz użyć go jako pierwszego znaku tylko wtedy, gdy masz na myśli („ukryty plik”). Kiedy masz na myśli, twoje nazwy plików to sekwencje specjalne VT100 ;-), więc ls zniekształca dane wyjściowe.źródło
Miałem tę samą potrzebę i szukałem rekomendacji lub standardowych referencji i natknąłem się na ten wątek. Moja obecna czarna lista znaków, których należy unikać w nazwach plików i katalogów, to:
źródło
@
na liście?b
? lol, zakładam, że to jest blank spaces
... cóż, które wciąż pozostawia kilka ...(),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg