Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Problem mit FindFirst und Dateiendungen

  Alt 21. Dez 2006, 10:22
Hallo Helmi,

Zitat von Helmi:
Wenn ich sowieso ein zweites mal prüfen muss ob die Endung pass, dann kann ich ja bei FindFirst alle Dateien suchen lassen (*.*)
Warum läßt du dir alle Dateien im Verzeichnis liefern, wenn dich nur eine Teilmenge interessiert? Damit schickst du ja auch alle Dateienamen durch UpperCase und einen Stringvergleich.

Zitat:
So brauch ich mir die Endung nicht speichern.
einzigste Änderung im normalen Code: anstatt "*.msk*, muss ich jetzt ".msk" schreiben
Dadurch wird die Routine aber auch unflexibler, weil sie Masken wie 'Level*.msk' nicht mehr unterstützt. Und das nur, weil du eine (lokale) Variable sparen möchtest?

Ich habe noch etwas festgestellt: bei der Verwendung von Jokerzeichen ('?' bzw. '*') in der Maske für die Namenserweiterung darf kein Vergleich der Extensions stattfinden, weil dieser Vergleich immer fehlschlagen würde. Die notwendigen Änderungen habe ich im folgenden Quelltext markiert:

Delphi-Quellcode:
procedure GetFilesInDirectory(Directory: String; const Mask: String; List: TStrings);
var
  ext : string;
  wild : Boolean; // neu
  SR: TSearchRec;
begin
  List.BeginUpdate;
  try
    List.Clear;
    If Directory <> 'then
      begin
        ext := ExtractFileExt(Mask);
        wild := (Pos('?', ext) > 0) or (Pos('*', ext) > 0); // neu
        Directory := IncludeTrailingPathDelimiter(Directory);
        If FindFirst(Directory + Mask, faAnyFile and (not faDirectory), SR) = 0 then
          try
            repeat
              if wild or SameText(ExtractFileExt(SR.Name), ext) then // geändert
                List.Add(Directory + SR.Name)
            until FindNext(SR) <> 0;
          finally
            FindClose(SR);
          end;
      end;
  finally
    List.EndUpdate;
  end;
end;
Ein Mangel läßt sich auf diesem Weg nicht so einfach umgehen: eine Maske wie '*.m??' liefert dir auch Dateinamen, deren Extension nicht genau drei Zeichen enthält.

Auch wenn du nicht alle Features der Routine im aktuellen Projekt brauchst, solltest du sie nicht entfernen - sie stören ja nicht. Irgendwann benötigst du sie vielleicht, und dann kannst du diese Funktion ohne Änderung wiederverwenden.

Gruß Hawkeye
  Mit Zitat antworten Zitat