2016-07-20 13 views
1

i eher zufällig auf dieses Bit hier in einem Projekt von einem Kollegen:Warum ersetzen ungültige Zeichen in einem Dateinamen mit ' 0'?

foreach (var invalidChar in Path.GetInvalidFileNameChars()) 
    fileName = fileName.Replace(invalidChar, '\0'); 

die gerenal Idee offensichtlich genug ist, aber ich frage mich, warum er wählte die ungültigen Zeichen mit dem wörtlichen für die Null-Zeichen anstelle einem ersetzen ' reguläres Zeichen oder nur eine leere Zeichenfolge.

Ich denke, es gibt einen guten Grund für diese Wahl (der Typ, der dies geschrieben hat, ist ein Senior in unserem Team), ich möchte nur wissen, was dieser Grund ist.

+2

Ich würde sagen, dass dies sogar einfach falsch ist ... Meine erste Vermutung ist, dass dies aus alten C-Code ist, wo Zeichenketten eine Null-terminiert. MSDN gibt an, dass Zeichen von 1 bis 31 + einige andere ungültig sind, die \ 0 nicht enthalten, aber ich bin ziemlich sicher, dass \ 0 Probleme verursachen wird. –

+1

Fragen Sie Ihren Senior-Entwickler, ob er noch in Ihrem Team ist. – Jehof

+0

@ThorstenDittmar mkay ... was würden Sie stattdessen vorschlagen? – garglblarg

Antwort

5

Nachdem ich die Frage kommentiert habe, suchte ich nach Beweis, dass \ 0 für Dateinamen eigentlich nicht erlaubt ist. I found it:

für einen Namen jedes Zeichen in der aktuellen Codepage verwenden, einschließlich Unicode-Zeichen und Zeichen in dem erweiterten Zeichensatz (128-255), mit Ausnahme der folgenden:
* Folgenden reservierten Zeichen: < (kleiner als),> (größer als),: (Doppelpunkt), "(Anführungszeichen),/(Schrägstrich), \ (umgekehrter Schrägstrich), | (senkrechter Strich oder senkrechter Strich),? (Fragezeichen), * (Sternchen))
* Integer-Wert Null, manchmal auch als ASCII-NUL-Zeichen bezeichnet
* Zeichen, deren Ganzzahldarstellungen im Bereich von 1 bis 31 liegen, außer für alternative Datenströme, für die diese Zeichen zulässig sind.

0

Wie einige kluge Menschen gibt es keine Sache als empty char. Vermeiden Sie auch Verwirrung über Leerzeichen ("") und leere Zeichenfolge ("").

+2

Das ist true, aber du kannst es mit einer leeren * string * ersetzen, die zumindest funktionieren würde :-) –

+1

ah ja, dieser thread räumte einiges auf, danke. – garglblarg

2

Es hängt vom OperationSystem ab, wo der Code ausgeführt wird. Aber unter Windows befindet sich das Zeichen \0 (0 als int) in der Liste ungültiger Zeichen für einen Dateinamen.

LinqPad (laufen unter Windows 10):

Path.GetInvalidFileNameChars().Contains('\0').Dump(); //true 

Ich denke, dieser Code aus einer anderen Sprache portiert wurde .net.

Es wäre besser, eine Ausnahme auszulösen (wenn ein Benutzer den Namen angegeben hat), wenn der Dateiname ungültige Zeichen enthält, anstatt sie durch irgendetwas zu ersetzen.

Wenn Sie sie ersetzen müssen, sollten Sie ein Zeichen wie _ auswählen, um zu verdeutlichen, dass möglicherweise etwas ersetzt wurde.

+0

Dies sollte in Windows-Servern ausgeführt werden, wenn also '\ 0' ein ungültiges Zeichen selbst ist, wäre das eine sinnlose Übung. Ich werde dafür sorgen, das MSDN zu konsultieren. – garglblarg

Verwandte Themen