Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Filterfehler bei FileListBox

  Alt 19. Mär 2021, 12:06
Hab's gerade mal mit Delphi 7 ausprobiert.

Der "Fehler" liegt nicht in der TFileListBox, sondern im in der procedure TFileListBox.ReadFileNames genutzten FindFirst. Kann man mit 'ner einfachen Routine testen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sr : TSearchRec;
begin
  if FindFirst('c:\temp\*.mmp',faAnyFile,sr) = 0 then begin
    ShowMessage(sr.Name
             + #13#13
             + sr.FindData.cAlternateFileName
             + #13#13
             + sr.FindData.cFileName);
  end;
end;
Es werden auch die Dateien mit der Endung mmpz gefunden.

Dies gilt analog auch für beliebige andere Dateiendungen, sofern sie länger als drei Zeichen sind, das ist dann wohl der alten Namenskonvention aus DOS-Zeiten von 8.3 geschuldet.
Oder anders formuliert: FindFirst sucht nach den kurzen Dateinamen (TSeachRec.FindData.cAlternateFileName), wie man sie in der Kommandozeile z. B. mit dir /x angezeigt bekommt. zu dem so gefundenen werden dann die langen Dateinamen in TSearchRec.Name bzw. TSearchRech.FindData.cFileName geliefert.
Die Arbeitsweise ist also "korrekt", wenn auch nicht mehr unbedingt zeitgemäß
Danke für diese Erkenntnis!
Aufbauend auf diesen Gedanken hier ein neues Snippet.
Deklarationen:
edPath.Text = ein gültiger pfad mit \ am ende, beispielsweise "C:\Test\"
edMask.Text = volle Maske, Beispiel "*.mm"

Es wird komplett auf diese veralteten Win3.1 Komponenten verzichtet.

Delphi-Quellcode:
type
  TForm3 = class(TForm)
    edPath: TEdit;
    edMask: TEdit;
    lbFiles: TListBox;
    btnStart: TButton;
    procedure btnStartClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.btnStartClick(Sender: TObject);
const
  FIND_FIRST_EX_LARGE_FETCH = 2;
var
  SL: TStringList;
  hFile: THandle;
  FindData: WIN32_FIND_DATA;
begin
  SL := TStringList.Create;
  try
    hFile := FindFirstFileEx(PChar(edPath.Text + edMask.Text), FindExInfoBasic, @FindData, FindExSearchNameMatch, nil, FIND_FIRST_EX_LARGE_FETCH);
    if hFile <> INVALID_HANDLE_VALUE then
      begin
        repeat
          if (((FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0) and (FindData.cFileName <> string('.')) and (FindData.cFileName <> string('..'))) then
            begin
              SL.Add(FindData.cFileName);
            end;
        until (not FindNextFile(hFile, FindData));
      end;
    Winapi.Windows.FindClose(hFile);
    lbFiles.Items.BeginUpdate;
    lbFiles.Clear;
    lbFiles.Items := SL;
    lbFiles.Items.EndUpdate;
  finally
    SL.Free;
  end;
end;

end.
Im Anhang ein Bild als Beweis was da raus kommt.

ggf PChar mit PWideChar ersetzen?
Miniaturansicht angehängter Grafiken
screenshot-19_03.png  
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat