Delphi 10.2でディレクトリ内のファイルを列挙する
触ったことがあるのがDelphi 5とか6が精々なので、流石にその頃とは違って今風の方法があるようです。でもExtractFilePath
なんかは現役で使えるみたいで安心しました😌
っていうかファイルを列挙する部分以外、昔(それこそ20年近く前では…)と全く同じだと思います。枯れた技術って素晴らしいです!
列挙の部分ですが、具体的にはTDirectory.GetFiles
メソッドを使います。TDirectory
というのがIOUtils
で定義されているので、usesに追記する必要がありました。引数は文字列でファイルのパスと、‘*.jpg’などお馴染みの検索パターンを指定します。TSearchOptionというのは、そのフォルダのみか、サブディレクトリも検索するかの指定みたいです。
ドキュメントは下記。昔はFindFirst的なものを使ったんでしたっけ?
docwiki.embarcadero.com
1 User
System.IOUtils.TDirectory.GetFiles - RAD Studio API Documentation
そして、この返り値がTStringDynArray
という初めて見る型なんですが、単純にarray of string
、文字列の配列に名前を付けたものでした。System.Types
で定義されているみたいなので、これもusesに追記します。
下記はTOpenPictureDialogを使って、ディレクトリ内のjpgファイルをリストボックスに追加するコードです。Delphiも今はfor..in
構文とか使えるんですね。当たり前か…… ちなみに、TOpenPictureDialogとかを使ってしまうとバリバリのVCLアプリケーションになってしまうので、今のDelphiの武器であるマルチOS対応とはいかないみたいです。
uses
... System.Types, IOUtils;
procedure TForm1.actListupFilesExecute(Sender: TObject);
var
Path: String;
FileList: TStringDynArray;
FileName: String;
begin
ListBox1.Items.Clear;
if OpenPictureDialog1.Execute then
begin
Path := ExtractFilePath(OpenPictureDialog1.FileName);
FileList := TDirectory.GetFiles(Path, '*.jpg', TSearchOption.soTopDirectoryOnly);
for FileName in FileList do
begin
ListBox1.Items.Add(FileName);
end;
end;
end;