Entwickler-Ecke

Sonstiges (Delphi) - Prüfung auf Dateityp .


Hochhaus - Do 17.07.14 10:47
Titel: Prüfung auf Dateityp .
Hallo allerseits !

der folgende Code funktioniert zwar prima. Ich frage mich aber, ob er nicht deutlich verbessert / optimiert werden kann. Danke für jeden Verbesserungsvorschlag !


Hochhaus


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
       Try
        S:=DlgSave.FileName;
        For I:= 1 To Length(S) Do Begin
          S[I] := Upcase(S[I]);
        End;
        If (Pos('.EXE',  S) > 1Then Tabu := True;
        If (Pos('.COM',  S) > 1Then Tabu := True;
        If (Pos('.DLL',  S) > 1Then Tabu := True;
        If (Pos('.OVL',  S) > 1Then Tabu := True;
        If (Pos('.SYS',  S) > 1Then Tabu := True;
        If (Pos('.DOCX',  S) > 1Then Tabu := True;
        If (Pos('.PPT',  S) > 1Then Tabu := True;
        If (Pos('.XLS',  S) > 1Then Tabu := True;
        If (Pos('.ACCD', S) > 1Then Tabu := True;
        If (Pos('.BAK',  S) > 1Then Tabu := True;
        If (Pos('.SIK',  S) > 1Then Tabu := True;
        If (Pos('.TMP',  S) > 1Then Tabu := True;
        If (Pos('.PDF',  S) > 1Then Tabu := True;
        If (Pos('.DCU',  S) > 1Then Tabu := True;
        If (Pos('.DFM',  S) > 1Then Tabu := True;
        If (Pos('.MP',   S) > 1Then Tabu := True;
        If (Pos('.MD',   S) > 1Then Tabu := True;
        If (Pos('.DB',   S) > 1Then Tabu := True;
        If (Pos('.RES',  S) > 1Then Tabu := True;
        If (Pos('.GH',   S) > 1Then Tabu := True;
        If (Pos('.NRG',  S) > 1Then Tabu := True;
        If (Pos('.IMG',  S) > 1Then Tabu := True;
        If (Pos('.ZIP',  S) > 1Then Tabu := True;
        If (Pos('.RAR',  S) > 1Then Tabu := True;
        If (Pos('.TIB',  S) > 1Then Tabu := True;
        If (Pos('.PNG',  S) > 1Then Tabu := True;
        If (Pos('.PDN',  S) > 1Then Tabu := True;
        If (Pos('.TGA',  S) > 1Then Tabu := True;
        If (Pos('.TIF',  S) > 1Then Tabu := True;
        If (Pos('.ICO',  S) > 1Then Tabu := True;
        If (Pos('.JPG',  S) > 1Then Tabu := True;
        If (Pos('.JPEG', S) > 1Then Tabu := True;
        If (Pos('.GIF',  S) > 1Then Tabu := True;
        If (Pos('.BMP',  S) > 1Then Tabu := True;
        If (Pos('.AVI',  S) > 1Then Tabu := True;
        If (Pos('.DBF',  S) > 1Then Tabu := True;
        If (Pos('.DOT',  S) > 1Then Tabu := True;
        If (Pos('.LIB',  S) > 1Then Tabu := True;
        If (Pos('.OBJ',  S) > 1Then Tabu := True;
        If (Pos('.WAV',  S) > 1Then Tabu := True;

        If Tabu Then Begin
          MessageDlg('Fehler: Dateityp wird nicht unterstützt !',
          mtError, [mbOk], 0);
          Status := False;
          SaveAs := Status;
          Exit;
        End;


Stundenplan - Do 17.07.14 11:24

Also, erstmal musst du gar nicht S zeichenweise in Großbuchstaben umwandeln; es gibt dafür schon die Funktion UpperCase(): S := UpperCase(DlgSave.FileName);
Da du sehr viele Dateitypen nicht zu unterstützen scheinst, wäre es da nicht vielleicht sinnvoller, nur auf die Endungen abzufragen, die unterstützt werden?

Die Zeile If (Pos('.EXE',  S) > 1Then Tabu := True; kann außerdem optimiert werden in

Delphi-Quelltext
1:
Tabu := Pos('.EXE',  S) > 1;                    

Macht man das für alle Zeilen, kommt ein Konstrukt raus à la

Delphi-Quelltext
1:
Tabu := (Pos('.EXE',  S) > 1or (Pos('.COM',  S) > 1or //...                    

Da das aber schnell in lange, unübersichtliche Zeilen ausartet, empfiehlt es sich vllt. eher, die Endungen als Auflistung (z.B. in einer Textdatei) abzuspeichern und dann mit Schleifen drüberzugehen.


mandras - Do 17.07.14 11:25


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
uses StrUtils;
procedure TForm1.FormCreate(Sender: TObject);
var FName:string;
    FExt : string;
    tabu : boolean;
    i : integer;
begin
 FName:='c:\x13.ppt';
 FExt := copy(ExtractFileExt (FName),2,255);
 i:=AnsiIndexText  (FExt, ['pdf','xls','ppt']);
 tabu := i<>-1;
end;


Jann1k - Do 17.07.14 11:25

Mit ExtractFileExt bekommst du außerdem direkt die Dateiendung und kannst dir die ganzen Pos-Aufrufe sparen.


WasWeißDennIch - Do 17.07.14 11:29


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses StrUtils;

function InvalidExtension(const Filename: string): Boolean;
const
  INVALID_EXT: array[0..2of string = ('.exe''.com''.dll'); //entsprechend erweitern
begin
  Result := AnsiIndexText(ExtractFileExt(Filename), INVALID_EXT) > -1;
end;


[edit] *Huch*, das wurde ja schon vorgeschlagen. Egal, als eigene Funktion gefällt es mir halt besser :) [/edit]


Hochhaus - Do 17.07.14 15:51

Vielen Dank für all Eure Vorschläge zur Optimierung ! Ihr seid grossartig ! Ich dachte mir schon, dass sich das verbessern lässt - wusste aber nicht, wie.


Hochhaus


Hochhaus - Do 17.07.14 16:37

user profile iconStundenplan hat folgendes geschrieben Zum zitierten Posting springen:
Da du sehr viele Dateitypen nicht zu unterstützen scheinst, wäre es da nicht vielleicht sinnvoller, nur auf die Endungen abzufragen, die unterstützt werden?


Es gibt leider auch keine abschliessende Liste von Dateitypen, die ich unterstütze. Wenn ich nur .TXT zulasse, ist das zu mager. Es sollen ja schliesslich auch .C und .PAS und viele weitere möglich sein ...


WasWeißDennIch - Do 17.07.14 16:42

Trotzdem wäre eine Whitelist vermutlich sinnvoller, da die Blacklist immer wieder gepflegt werden müsste und Du so gut wie unmöglich alle nicht unterstützten Endungen auflisten kannst.


Hochhaus - Do 17.07.14 18:33

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses StrUtils;

function InvalidExtension(const Filename: string): Boolean;
const
  INVALID_EXT: array[0..2of string = ('.exe''.com''.dll'); //entsprechend erweitern
begin
  Result := AnsiIndexText(ExtractFileExt(Filename), INVALID_EXT) > -1;
end;




Meine ältere Delphi-Version unterstützt AnsiIndexText nicht ... was soll ich da tun ?

Hochhaus

//EDIT: Sorry, mein Fehler ! Ich habe StrUtils nicht eingebunden ...


jaenicke - Do 17.07.14 21:20

Normalerweise gibt es dafür die Möglichkeit im Öffnen-Dialog von den bekannten Typen auf "Alle Dateien" umzuschalten (sprich man füllt normalerweise die Eigenschaft Filter). Wer das macht, kann dann auch unbekannte Dateitypen öffnen, aber es kommen ggf. keine sinnvollen Ergebnisse heraus.