![]() |
Websichere Dateinamen?
Hallo,
ich brauche "websichere" Dateinamen (Kleinbuchstaben, keine Leer- und Sonderzeichen usw.). Ich habe etwa an folgenden Funktions-Prototyp gedacht:
Delphi-Quellcode:
Oder gibt es schon fertige Funktionen dafür?
function GibMirNenWebsicherenDateinamenZurueck(const S: string): string;
begin // 1. In Kleinbuchstaben umwandeln: Result := LowerCase(S); // 2. Dedizierte Sonderzeichen-Umwandlungen: // ä->ae, ö->oe, ü->ue, ß->ss, ñ->n, à->a, á->a, è->e, // é->e, ì->i, í->i, ò->o, ó->o, ù->u, ú->u, -->_ // Token vom User editierbar Result := CustomSonderzeichenNachASCII(Result); // 3. Auf zugelassene Zeichen beschränken: // Token vom User editierbar // Alle Zeichen außer ['a-z', '0-9'] umwandeln nach '_': Result := AlleAnderenZeichenUmwandeln(Result, ['a-z', '0-9'], '_'); // 4. Unterstriche zusammenfassen: Maximal [1] Unterstrich hintereinander: Result := UnterstricheBegrenzen(Result, '_', 1); end; Wie würdet ihr das machen? Bitte um eine sachliche Diskussion ;-) |
AW: Websichere Dateinamen?
schnell runtergetippt:
Delphi-Quellcode:
function GibMirNenWebsicherenDateinamenZurueck(const S: string): string;
var aChr: Char; insetIndex: Integer; LastSignChanged: Boolean; begin SetLength(Result, length(S)); insetIndex := 1; LastSignChanged := false; for aChr in S do begin if (aChr in ['a'..'z']) or (aChr in ['0'..'9']) or (aChr in ['A'..'Z']) then begin LastSignChanged := false; Result[insetIndex] := LowerCase(aChr)[1] end else if LastSignChanged then Continue else begin Result[insetIndex] := '_'; LastSignChanged := true end; inc(insetIndex); end; SetLength(Result, insetIndex-1); end; |
AW: Websichere Dateinamen?
Hallo mleyen, vielen Dank für deinen Beitrag! Ist ein sehr intelligenter Code, wie ich meine!
Und die Sonderzeichenbehandlung dann gleich am Anfang einbauen! |
AW: Websichere Dateinamen?
Gerne. :-D
Man hätte es auch einzelnd sauber in Unterfunktionen aufteilen können, mach ich eigentlich auch normalerweise. Nur bei vielen Schleifen kann schnell mal ungewollt die Performance drunter leiden. Oh, ich seh gerade das ich gar nicht die
Delphi-Quellcode:
drin hab ;/
// 2. Dedizierte Sonderzeichen-Umwandlungen:
|
AW: Websichere Dateinamen?
Hier noch die Fassung mit der zeichenspezifischen Umwandlung:
Delphi-Quellcode:
Wer eine saubere Fassung hat: Herzlichen Glühstrumpf :lol:
type
TCustomSign = packed record Sign: Char; TranslatedStr: string; end; const CustomSigns: array[0..2] of TCustomSign = ( (Sign: 'ö'; TranslatedStr: 'oe'), // <--- Hier die benutzerspezifischen Umwandlungen eintragen (Sign: 'ü'; TranslatedStr: 'ue'), (Sign: 'ä'; TranslatedStr: 'ae') ); function GibMirNenWebsicherenDateinamenZurueck(const S: string): string; function IsCustomSign(const aChr: Char; out TrnsltdStr: string): Boolean; var i: Integer; begin for i := Low(CustomSigns) to high(CustomSigns) do if aChr = CustomSigns[i].Sign then begin Result := true; TrnsltdStr := CustomSigns[i].TranslatedStr; Exit; end; Result := false; end; var aChr: Char; insertIndex: Integer; LastSignChanged: Boolean; CustomStr: string; begin SetLength(Result, length(S)); insertIndex := 1; LastSignChanged := false; for aChr in S do begin if IsCustomSign(aChr, CustomStr) then begin LastSignChanged := false; Insert(CustomStr, Result, insertIndex); insertIndex := insertIndex + Length(CustomStr); Continue; end else if (aChr in ['a'..'z']) or (aChr in ['0'..'9']) or (aChr in ['A'..'Z']) then begin LastSignChanged := false; Result[insertIndex] := LowerCase(aChr)[1] end else if LastSignChanged then Continue else begin Result[insertIndex] := '_'; LastSignChanged := true end; inc(insertIndex); end; SetLength(Result, insertIndex-1); end; |
AW: Websichere Dateinamen?
Liste der Anhänge anzeigen (Anzahl: 1)
Sehr schöne Funktion, mleyen, vielen Dank dafür!
Bevor ich deinen Code gesehen habe, hab' ich mich selbst an die Arbeit gemacht und deine Funktion erweitert. Dabei wird berücksichtigt, dass der Anwender die Sonderzeichenumwandlung nach seinen Wünschen selbst in einem Editfeld eingeben können soll, wodurch die Anzahl der Sonderzeichen-Umwandlungen zur Design-Zeit noch nicht feststeht:
Delphi-Quellcode:
function TForm1.GibMirNenWebsicherenDateinamenZurueck(S: string): string;
// http://www.delphipraxis.net/156698-websichere-dateinamen.html var aChr: Char; insetIndex, i: Integer; LastSignChanged: Boolean; slToken: TStringList; begin S := Trim(AnsiLowerCase(S)); // Sonderzeichen ersetzen: slToken := TStringList.Create; try StrTokenToStrings(edt3.Text, ',', slToken); // benötigt JCL for i := 0 to slToken.Count - 1 do begin slToken[i] := Trim(slToken[i]); S := StringReplace(S, slToken.Names[i], slToken.ValueFromIndex[i], [rfReplaceAll]); end; finally slToken.Free; end; // ... und dann der Rest: SetLength(Result, length(S)); insetIndex := 1; LastSignChanged := false; for aChr in S do begin if (aChr in ['a'..'z']) or (aChr in ['0'..'9']) or (aChr in ['A'..'Z']) then begin LastSignChanged := false; Result[insetIndex] := LowerCase(aChr)[1] end else if LastSignChanged then Continue else begin Result[insetIndex] := '_'; LastSignChanged := true end; inc(insetIndex); end; SetLength(Result, insetIndex-1); end; procedure TForm1.btn1Click(Sender: TObject); begin edt2.Text := GibMirNenWebsicherenDateinamenZurueck(edt1.Text); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz