für eine kleine nervige Aufgabe dachte ich mir:" Schreibst Du Dir schnell mal ein kleines Tool.". Aber , ....
Eigentlich schon x-mal eingesetzt, wollte ich unter Linux (Mint 19.1) nur ein Verzeichnis rekursiv durchsuchen und hinterher die gefundenen Dateien umbenennen.
Nur es kommt nichts in der Ergebnisliste an.
Wenn ich schon dabei bin, ist es aufwendig die Suche Plattformunabhängig zu gestalten?
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
CheckBox1: TCheckBox; //Rekursive Suche
CheckBox2: TCheckBox; // Altes Ergebnis löschen
LabeledEdit1: TLabeledEdit;
ListBox1: TListBox;
SelectDirectoryDialog1: TSelectDirectoryDialog;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure GetFilesInDirectory(Directory: string; const Mask: string;
List: TStrings;
WithSubDirs, ClearList: Boolean);
// Quelle:
// https://www.delphi-treff.de/tipps-tricks/dateienverzeichnisse/dateioperationen/rekursiv-nach-dateien-suchen/
//
// Für Linux: Pfadtrennzeichen "umgedreht" bzw. gelöscht
//
procedure ScanDir(const Directory: string);
var
SR: TSearchRec;
begin
if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try
repeat
List.Add(Directory + SR.Name)
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
if WithSubDirs then begin
if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
repeat
if ((SR.attr and faDirectory) = faDirectory) and
(SR.Name <> '.') and (SR.Name <> '..') then
ScanDir(Directory + SR.Name ); // + '\');
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
end;
begin
List.BeginUpdate;
try
if ClearList then
List.Clear;
if Directory = '/' then Exit;
if Directory[Length(Directory)] <> '/' then
Directory := Directory + '/';
ScanDir(Directory);
finally
List.EndUpdate;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Mask : String;
begin
If LabeledEdit1.text='' then LabeledEdit1.text:='*.*';
if SelectDirectoryDialog1.Execute then
GetFilesInDirectory(SelectDirectoryDialog1.FileName, Mask, Listbox1.Items, CheckBox1.checked, CheckBox2.checked);
end;
end.
Gruß HEiko