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?