Ich weiß, dass / unter Linux illegal ist, und die folgenden sind unter Windows illegal (glaube ich) *
.
"
/
\
[
]
:
;
|
,
Was fehlt mir noch?
Ich benötige jedoch eine umfassende Anleitung, die Doppelbyte-Zeichen berücksichtigt. Das Verknüpfen mit externen Ressourcen ist für mich in Ordnung.
Ich muss zuerst ein Verzeichnis im Dateisystem mit einem Namen erstellen, der möglicherweise verbotene Zeichen enthält. Daher plane ich, diese Zeichen durch Unterstriche zu ersetzen. Ich muss dann dieses Verzeichnis und seinen Inhalt in eine Zip-Datei (mit Java) schreiben, daher wäre jeder zusätzliche Rat bezüglich der Namen von Zip-Verzeichnissen willkommen.
echo abc > "ab.;,=[1]"
Antworten:
Eine „umfassende Anleitung“ für verbotene Dateinamenzeichen funktioniert unter Windows nicht, da sowohl Dateinamen als auch Zeichen reserviert werden. Ja, Zeichen wie
*
"
?
und andere sind verboten, aber es gibt unendlich viele Namen, die nur aus gültigen Zeichen bestehen, die verboten sind. Beispielsweise sind Leerzeichen und Punkte gültige Dateinamenzeichen, aber Namen, die nur aus diesen Zeichen bestehen, sind verboten.Windows unterscheidet nicht zwischen Groß- und Kleinbuchstaben. Sie können daher keinen Ordner mit dem Namen erstellen,
A
wenn bereits ein Namea
vorhanden ist. Schlimmer noch, scheinbar erlaubte Namen wiePRN
undCON
und viele andere sind reserviert und nicht erlaubt. Windows hat auch mehrere Längenbeschränkungen. Ein in einem Ordner gültiger Dateiname kann ungültig werden, wenn er in einen anderen Ordner verschoben wird. Die Regeln zum Benennen von Dateien und Ordnern finden Sie in den Microsoft-Dokumenten.Sie können im Allgemeinen keinen benutzergenerierten Text verwenden, um Windows-Verzeichnisnamen zu erstellen. Wenn Sie etwas zu benennen , damit die Benutzer , was sie wollen, müssen Sie wie sichere Namen erstellen
A
,AB
,A2
et al., Speichern von benutzergenerierten Namen und deren Pfad Äquivalente in einer Anwendungsdatendatei und Pfadzuordnung in Ihrer Anwendung auszuführen.Wenn Sie vom Benutzer generierte Ordnernamen unbedingt zulassen müssen, können Sie nur feststellen, ob sie ungültig sind, indem Sie Ausnahmen abfangen und davon ausgehen, dass der Name ungültig ist. Selbst das ist mit Gefahren verbunden, da sich die Ausnahmen für verweigerten Zugriff, Offline-Laufwerke und Speicherplatz außerhalb des Laufwerks mit denen überschneiden, die für ungültige Namen ausgelöst werden können. Sie öffnen eine riesige Dose mit Verletzungen.
quelle
A.txt
war ungültig , weila.TXT
existiert.COPY CON PRN
bedeutet, von der Tastatureingabe oder einem möglichen Standard zu lesen und auf das Druckergerät zu kopieren. Ich bin mir nicht sicher, ob es für moderne Fenster noch gültig ist, war es aber schon lange. Früher konnte man damit Text eingeben und von einem Nadeldrucker einfach ausgeben lassen.Lassen Sie es uns einfach halten und zuerst die Frage beantworten.
Die verbotenen druckbaren ASCII-Zeichen sind:
Linux / Unix:
Windows:
Nicht druckbare Zeichen
Wenn Ihre Daten aus einer Quelle stammen, die nicht druckbare Zeichen zulässt, müssen Sie nach weiteren Daten suchen.
Linux / Unix:
Windows:
Hinweis: Während es unter Linux / Unix-Dateisystemen legal ist, Dateien mit Steuerzeichen im Dateinamen zu erstellen, kann es für die Benutzer ein Albtraum sein, mit solchen Dateien umzugehen .
Reservierte Dateinamen
Die folgenden Dateinamen sind reserviert:
Windows:
(sowohl alleine als auch mit beliebigen Dateierweiterungen, z
LPT1.txt
. B. ).Andere Regeln
Windows:
Dateinamen dürfen nicht mit einem Leerzeichen oder einem Punkt enden.
quelle
Unter Linux und anderen Unix-bezogenen Systemen gibt es nur zwei Zeichen, die nicht im Namen einer Datei oder eines Verzeichnisses erscheinen können. Dies sind NUL
'\0'
und Schrägstrich'/'
. Der Schrägstrich kann natürlich in einem Pfadnamen erscheinen, der die Verzeichniskomponenten trennt.Gerücht 1 hat es , dass Steven Bourne (von ‚Shell‘ Ruhm) hatte ein Verzeichnis mit 254 Dateien, einen für jeden einzelnen Buchstaben (Zeichencode) , die in einem Dateinamen ( mit Ausnahme erscheinen
/
,'\0'
, der Name.
war das aktuelle Verzeichnis, natürlich ). Es wurde verwendet, um die Bourne-Shell zu testen und routinemäßig Chaos an unachtsamen Programmen wie Sicherungsprogrammen zu verursachen.Andere Personen haben die Windows-Regeln behandelt.
Beachten Sie, dass MacOS X über ein Dateisystem verfügt, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird.
1 Es war Kernighan & Pike in der Praxis des Programmierens, der dies in Kapitel 6, Testen, §6.5 Stresstests, sagte:
Beachten Sie, dass das Verzeichnis Einträge enthalten muss
.
und..
es sich also wohl um 253 Dateien (und 2 Verzeichnisse) oder 255 Namenseinträge anstatt um 254 Dateien handelte. Dies hat keinen Einfluss auf die Wirksamkeit der Anekdote oder die darin beschriebenen sorgfältigen Tests.quelle
/
im Namen benannt. Das verursachte einige Probleme, als es ein neues Verzeichnis mit dem Schema in erstellte.PATH
Variablen hinzufügen können, wenn ein Verzeichnis einen Doppelpunkt enthält, da der Doppelpunkt als Trennzeichen verwendet wird (Semikolon unter Windows). Programme in einem solchen Verzeichnis müssen also entweder mit einem Pfadnamen ausgeführt werden, der angibt, wo sie sich befinden (kann relativ oder absolut sein), oder Sie müssen sich im Verzeichnis befinden und einen Punkt (.
das aktuelle Verzeichnis) habenPATH
, der allgemein als angesehen wird eine unsichere.Anstatt eine schwarze Liste mit Zeichen zu erstellen, können Sie auch eine Whitelist verwenden . Alles in allem ist der Zeichenbereich, der in einem Datei- oder Verzeichnisnamenskontext sinnvoll ist, recht kurz. Wenn Sie keine sehr spezifischen Namensanforderungen haben, werden Ihre Benutzer ihn nicht für Ihre Anwendung verwenden, wenn sie nicht die gesamte ASCII-Tabelle verwenden können.
Das Problem der reservierten Namen im Zieldateisystem wird nicht gelöst, aber mit einer Whitelist ist es einfacher, die Risiken an der Quelle zu mindern.
In diesem Sinne ist dies eine Reihe von Charakteren, die als sicher angesehen werden können:
Und alle zusätzlichen sicheren Zeichen, die Sie zulassen möchten. Darüber hinaus müssen Sie nur einige zusätzliche Regeln für Leerzeichen und Punkte durchsetzen . Dies ist normalerweise ausreichend:
Dies erlaubt bereits recht komplexe und unsinnige Namen. Diese Namen wären beispielsweise mit diesen Regeln möglich und unter Windows / Linux gültige Dateinamen:
A...........ext
B -.- .ext
Im Wesentlichen sollten Sie auch bei so wenigen Zeichen auf der Whitelist entscheiden, was tatsächlich Sinn macht, und den Namen entsprechend validieren / anpassen. In einer meiner Anwendungen habe ich die gleichen Regeln wie oben verwendet, jedoch doppelte Punkte und Leerzeichen entfernt.
quelle
Die einfache Möglichkeit, Windows dazu zu bringen, Ihnen die Antwort mitzuteilen, besteht darin, zu versuchen, eine Datei über den Explorer umzubenennen und / für den neuen Namen einzugeben. Windows öffnet ein Meldungsfeld mit der Liste der unzulässigen Zeichen.
https://support.microsoft.com/en-us/kb/177506
quelle
Wenn Sie nur zu Forschungszwecken arbeiten, sollten Sie sich diesen Wikipedia-Eintrag zu Dateinamen ansehen .
Wenn Sie eine tragbare Funktion schreiben möchten, um Benutzereingaben zu validieren und darauf basierend Dateinamen zu erstellen, lautet die kurze Antwort " Nicht" . Schauen Sie sich ein tragbares Modul wie Perls File :: Spec an, um einen Einblick in alle Hops zu erhalten, die für eine solche "einfache" Aufgabe erforderlich sind.
quelle
Unter Windows können Sie dies mit PowerShell überprüfen
Um UTF-8-Codes anzuzeigen, können Sie konvertieren
quelle
In Windows 10 (2019) sind die folgenden Zeichen durch einen Fehler verboten, wenn Sie versuchen, sie einzugeben:
quelle
Hier ist eine AC # -Implementierung für Windows basierend auf der Antwort von Christopher Oezbek
Es wurde durch den Booleschen Wert "enthältFolder" komplexer, deckt aber hoffentlich alles ab
quelle
StringBuilder
mit dem anfänglichen Kapazitätswert initialisiert ? 2. Warum haben Sie 12 zur Länge des hinzugefügtfilename
? 3. Wurden 12 willkürlich ausgewählt oder gab es einen Gedanken hinter dieser Zahl?Bis zum 18.04.2017 ist unter den Antworten auf dieses Thema keine einfache schwarze oder weiße Liste von Zeichen und Dateinamen ersichtlich - und es gibt viele Antworten.
Der beste Vorschlag, den ich machen konnte, war, den Benutzer die Datei benennen zu lassen, wie er möchte. Verwenden Sie eine Fehlerbehandlungsroutine, wenn die Anwendung versucht, die Datei zu speichern, fangen Sie Ausnahmen ab, nehmen Sie an, dass der Dateiname schuld ist (offensichtlich nachdem Sie sichergestellt haben, dass der Speicherpfad ebenfalls in Ordnung ist), und fordern Sie den Benutzer zur Eingabe eines neuen Dateinamens auf. Um die besten Ergebnisse zu erzielen, platzieren Sie dieses Überprüfungsverfahren in einer Schleife, die fortgesetzt wird, bis der Benutzer es richtig macht oder aufgibt. Hat am besten für mich funktioniert (zumindest in VBA).
quelle
Obwohl die einzigen illegalen Unix-Zeichen sein könnten
/
undNULL
, obwohl einige Überlegungen zur Befehlszeileninterpretation enthalten sein sollten.Während es beispielsweise legal sein kann, eine Datei
1>&2
oder2>&1
unter Unix zu benennen , können Dateinamen wie diese bei der Verwendung in einer Befehlszeile falsch interpretiert werden.Ebenso ist es möglich, eine Datei zu benennen
$PATH
, aber wenn Sie versuchen, über die Befehlszeile darauf zuzugreifen, wird die Shell$PATH
in ihren Variablenwert übersetzt .quelle
$'myvalueis'
, ex:$ echo 'hi' > $'2>&1'
,cat 2\>\&1
„hallo“Schwierigkeiten bei der Definition, was legal ist und was nicht, wurden bereits angesprochen und Whitelists vorgeschlagen . Windows unterstützt jedoch mehr als 8-Bit- Zeichen. Wikipedia gibt an , dass (zum Beispiel) die
Daher möchte ich einen viel liberaleren Ansatz vorstellen, bei dem Unicode-Zeichen verwendet werden, um die "illegalen" zu ersetzen. Ich fand das Ergebnis in meinem vergleichbaren Anwendungsfall weitaus lesbarer. Schauen Sie zum Beispiel in diesen Block . Außerdem können Sie sogar den ursprünglichen Inhalt wiederherstellen. Mögliche Auswahlmöglichkeiten und Recherchen finden Sie in der folgenden Liste:
U+002A * ASTERISK
), können Sie eine der vielen aufgelistet, zum BeispielU+2217 ∗ (ASTERISK OPERATOR)
oder dieFull Width Asterisk U+FF0A *
⋅ U+22C5 dot operator
“ U+201C english leftdoublequotemark
(Alternativen siehe hier )/ SOLIDUS U+002F
) können Sie∕ DIVISION SLASH U+2215
(andere hier ) verwenden.\ U+005C Reverse solidus
) können Sie⧵ U+29F5 Reverse solidus operator
( more ) verwenden.U+005B Left square bracket
) und ](U+005D Right square bracket
) können Sie zum BeispielU+FF3B[ FULLWIDTH LEFT SQUARE BRACKET
undU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET
(von hier aus mehr Möglichkeiten hier ) verwenden.U+2236 ∶ RATIO (for mathematical usage)
oderU+A789 ꞉ MODIFIER LETTER COLON
(siehe Doppelpunkt (Buchstabe)) verwenden , der manchmal in Windows-Dateinamen verwendet wird, da er mit dem Doppelpunkt in der für Dateinamen verwendeten Segoe-UI- Schriftart identisch ist . Der Doppelpunkt selbst ist nicht zulässig.) (Siehe hier )U+037E ; GREEK QUESTION MARK
(siehe hier )U+0964 । DEVANAGARI DANDA
,U+2223 ∣ DIVIDES
oderU+01C0 ǀ LATIN LETTER DENTAL CLICK
( Wikipedia ). Auch die Boxzeichen enthalten verschiedene andere Optionen., U+002C COMMA
) können Sie zum Beispiel verwenden‚ U+201A SINGLE LOW-9 QUOTATION MARK
(siehe hier )U+003F ? QUESTION MARK
), das sind gute Kandidaten:U+FF1F ? FULLWIDTH QUESTION MARK
oderU+FE56 ﹖ SMALL QUESTION MARK
(aus er wieder zwei weiteren von Dingbats - Block , für „Frage“ suchen)quelle
Beim Erstellen von Internetverknüpfungen in Windows werden beim Erstellen des Dateinamens unzulässige Zeichen übersprungen, mit Ausnahme des Schrägstrichs, der in Minus konvertiert wird.
quelle
In Unix-Shells können Sie fast jedes Zeichen in einfache Anführungszeichen setzen
'
. Außer dem einfachen Anführungszeichen selbst, und Sie können keine Steuerzeichen ausdrücken, da\
es nicht erweitert ist. Der Zugriff auf das einfache Anführungszeichen selbst aus einer Zeichenfolge in Anführungszeichen heraus ist möglich, da Sie Zeichenfolgen mit einfachen und doppelten Anführungszeichen verketten können, wie'I'"'"'m'
sie für den Zugriff auf eine Datei mit dem Namen verwendet werden können"I'm"
(doppeltes Anführungszeichen auch hier möglich).Sie sollten daher alle Steuerzeichen vermeiden, da sie zu schwer in die Shell einzugeben sind. Der Rest ist immer noch lustig, insbesondere Dateien, die mit einem Bindestrich beginnen, da die meisten Befehle diese als Optionen lesen, es sei denn, Sie haben zuvor zwei Bindestriche
--
oder Sie geben sie mit an./
, wodurch auch der Start ausgeblendet wird-
.Wenn Sie nett sein möchten, verwenden Sie keine der Zeichen, die die Shell und typische Befehle als syntaktische Elemente verwenden, manchmal positionsabhängig, z. B. können Sie sie weiterhin verwenden
-
, jedoch nicht als erstes Zeichen. Ebenso.
können Sie es nur dann als erstes Zeichen verwenden, wenn Sie es ernst meinen ("versteckte Datei"). Wenn Sie gemein sind, sind Ihre Dateinamen VT100-Escape-Sequenzen ;-), so dass ein ls die Ausgabe verstümmelt.quelle
Ich hatte das gleiche Bedürfnis und suchte nach Empfehlungen oder Standardreferenzen und stieß auf diesen Thread. Meine aktuelle schwarze Liste von Zeichen, die in Datei- und Verzeichnisnamen vermieden werden sollten, ist:
quelle
@
die Liste zu kommentieren ?b
? lol, ich nehme an, das ist das b vonlank spaces
... nun, das lässt noch ein paar(),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg
übrig ... Ich habe ein Bild umbenannt , musste es aber zurück ändern, weil es wütend aussah ...