ich bin gerade dabei eine Eingabe auf einen gültigen Dateinamen zu checken. Dabei habe ich im Internet verschiedene Ansätze gefunden.
- Einmal eine Blacklist mit allen Zeichen, die nicht enthalten sein dürfen z.B.: /*."/\[]:;|,<> ? (ohne Gewähr auf Vollständigkeit)
- Dasselbe mit einer Whitelist (alle Zeichen die darin enthalten sein dürfen)
Und dann gibt es noch eine Menge Ausnahmen und Erweiterungen, je nach Betriebs- und verwendetem Dateisystem....
Da hab ich mir gedacht: Erstelle doch einfach eine Datei mit der angegebenen Eingabe und schau ob ein Fehler auftritt. Wenn kein Fehler auftritt ist der Dateiname gültig. (Die Test-Datei wird danach wieder gelöscht).
Gesagt, getan. Den Test hab ich mit den sinnigen Dateiname :; durchgeführt, der ja oben in der Blacklist ist. Übrigens ich verwende hier Win10.
Interessanterweise trat kein Fehler auf. Danach hab ich die Datei im Explorer und mittels der Eingabeaufforderung gesucht und - Überraschung - nicht gefunden.
Danach habe ich in die Datei :; etwas reingeschrieben, Datei geschlossen, wieder geöffnet und da war tatsächlich der Text drin den ich vorher reingeschrieben habe.
Jetzt frag ich mich wie passt das alles zusammen? Kann das jemand erklären?
Hier der Code-Schnipsel mit dem ich das gemacht habe:
Code: Alles auswählen
procedure CheckInput(aStr: string);
Var
sl : TStringList;
begin
// Leerzeichen durch Underlines ersetzen
aStr := StringReplace(aStr, ' ', '_', [rfReplaceAll]);
// Mittels StringList eine Datei erzeugen.
sl := TStringList.Create;
sl.Text := 'test___FGH';
sl.SaveToFile('D:\'+aStr);
// StringList säubern und Inhalt darstellen, nur zum Check ob sie wirklich leer ist.
sl.Clear;
ShowMessage(sl.Text);
// Datei wieder einlesen.
sl.LoadFromFile('D:\'+aStr);
// Inhalt der Datei anzeigen
if FileExists('D:\'+aStr) then
ShowMessage('Done '+sl.Text)
else
ShowMessage('Fail '+aStr);
sl.Free;
end;
begin
CheckInput(':;');
end.