AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Aktuelle Datei finden

Ein Thema von Willie1 · begonnen am 9. Dez 2024 · letzter Beitrag vom 14. Dez 2024
Antwort Antwort
Willie1

Registriert seit: 28. Mai 2008
691 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Aktuelle Datei finden

  Alt 9. Dez 2024, 17:52
Hallo Leute,
ich habe eine große Zahl von Dateien mit den Namen: 1-Liga00.fus, ... 2-Liga25, 3-Liga25.fus usw., wobei die Zahl das Jahr angibt. Das Jahr 3??? interessiert hier nicht. Ich will jetzt nur die aktuellen Dateien auswählen können. Der Dateiname wird bei der Anlage so festgelegt.
Ich habe mir Folgendes gedacht:
Delphi-Quellcode:
function FindFootballFiles(const Path: string): TStringDynArray;
var
  FileFilter : TDirectory.TFilterPredicate;
  s: string;
  J, Lj: Word;
  Po: Integer;
begin
  FileFilter :=
    function(const Path: String; const SearchRec: TSearchRec): Boolean
    begin
      po := Pos('.',SearchRec.Name)-3;
      s := string(SearchRec.Name).SubString(Po,2);
      try
        Lj := s.ToInteger + 2000;
      except
        Exit(false);
      end;
      J := YearOf(Today);
      Result := (J = Lj) or (J = Pred(Lj));
    end;
    Result := TDirectory.GetFiles(Path, '*.fus', TSearchOption.soAllDirectories, FileFilter);
end;
Wie findet ihr diesen Ansatz? Ist mir klar, wenn der Anwender den Dateinamen ändert, funktioniert die Sache nicht mehr.
Gruß Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
513 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Aktuelle Datei finden

  Alt 9. Dez 2024, 18:33
Ich bin mir nicht sicher ob ich dich richtig verstehe, aber versuch es mal so:
Delphi-Quellcode:
function FindFootballFiles(const Path: string): TStringDynArray;
var
  FileFilter : TDirectory.TFilterPredicate;
begin
  var sYear : string := FormatDateTime('YY', Now);
  SearchPattern := Format('?-Liga%s.fus', [sYear]);

  FileFilter :=
    function(const Path: String; const SearchRec: TSearchRec): Boolean
    begin
      Result := Winapi.ShLwApi.PathMatchSpecW(PChar(SearchRec.Name), PChar(SearchPattern));
    end;
  
  Result := TDirectory.GetFiles(Path, '*.*', TSearchOption.soAllDirectories, FileFilter);
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#3

AW: Aktuelle Datei finden

  Alt 9. Dez 2024, 19:14
Debuggen ist wohl etwas, was du nie benutzt?

Zitat:
Delphi-Quellcode:
try
  StrToInt oder .ToInteger
except
  // nix machen
end;
Für sowas sollte einem der Popo verhauen werden.

Delphi-Referenz durchsuchenTryStrToInt oder Delphi-Referenz durchsuchenStrToIntDef


Delphi-Quellcode:
if TryStrToInt(RightStr(ChangeFileExt(SearchRec.Name, ''), 2), i) then
  MachWasMit(i);
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Dez 2024 um 20:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von FriedrichAT
FriedrichAT

Registriert seit: 25. Mai 2019
Ort: Wien
35 Beiträge
 
Delphi 12 Athens
 
#4

AW: Aktuelle Datei finden

  Alt 9. Dez 2024, 19:45
Hallo
Ich machs "meisten" so...

Delphi-Quellcode:
// Liest das Übergebene "Dir" ein
procedure TForm1.ReadDir(const Dir: String);
var ExtMask: TDirectory.TFilterPredicate;
    SOpt: TSearchOption;
begin
  // ----------------------------------------------------------------------
  ExtMask:= function(const Pfad: String; const SR: TSearchRec): Boolean
            begin
              Result:= (ExtractFileExt(SR.Name) = '.fus');
            end;
  // ----------------------------------------------------------------------
  if CbRecursive.Checked then // Ist ein CheckBox
    SOpt:= TSearchOption.soAllDirectories
  else
    SOpt:= TSearchOption.soTopDirectoryOnly;

  FArr:= TDirectory.GetFiles(Dir, '*.*', SOpt, ExtMask); // Ist dein TStringDynArray
end;
Friedrich
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#5

AW: Aktuelle Datei finden

  Alt 9. Dez 2024, 20:52
Zitat:
Ich machs "meisten" so...
abc.FUS ?

SameText/
Zitat:
AnsiSameText
oder Delphi-Referenz durchsuchenSameFileName

Und wenn du eh nur nach der Dateiendung filtern willst, ist das eh unnötig zuviel.
TDirectory.GetFiles(Dir, '*.fus', SOpt)


Und da wir schon dabei sind, gibt es eine geheime Funktion, in der Delphiklasse, denn sie lässt nicht Windows (Bei Google suchenFindFirstFile) filtern, sondern macht das selbst Delphi-Referenz durchsuchenMatchesMask und das kennt auch Char-Sets/Ranges. (und nein, es ist kein RegEx!!!)
Delphi-Quellcode:
var
  Year, i: Integer;
  Found: string;
begin
  Year := -1;
  Found := '';
  for var Filename in TDirectory.GetFiles('C:\_D', '*[0-9][0-9].fus', TSearchOption.soAllDirectories) do
    if TryStrToInt(RightStr(ChangeFileExt(Filename, ''), 2), i) and (i > Year) then begin
      Year := i;
      Found := Filename;
    end;
  ShowMessage(i.ToString + ' ' + Found);
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
691 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

AW: Aktuelle Datei finden

  Alt 11. Dez 2024, 18:40
Zitat von himitsu:
if TryStrToInt(RightStr(ChangeFileExt(Filename, ''), 2), i) and (i > Year) then
Dann muss aber der Compiler auf Kurzschluss gestellt sein. Was enthält i, wenn Try fehlschlägt? Was aber eigentlich nicht passieren kann wg. der Suchmaske.

Dann noch etwas Grundsätzliches: Ich könnte natürlich eine Recent-Liste anlegen. Aber die zeigt stur immer die zuletzt aufgerufenen Dateien an, während meine Lösung die aktuellen Files zur Auswahl anbietet! Oder Beides?

Himitsu, ich habe mal nach deinem Nicknamen gegooglet, interessant. Du hast die besten Tricks drauf. So werde ich es machen.

Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 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