【问题标题】:Searching for a string in log files在日志文件中搜索字符串
【发布时间】:2021-12-16 10:35:00
【问题描述】:

我想通过单击 TButton2 在我的计算机中的选定文件夹中搜索添加到 CheckListBox 的关键字。我的意思是该应用程序将搜索所选文件夹中的所有日志文件。我不想选择单个文件在其中搜索,而是选择所有文件夹。请帮帮我

如果有帮助,这是我的全部代码:

unit UPrzeszukiwaczLogów;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.CheckLst, Vcl.ExtCtrls, FileCtrl,
  System.Actions;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    CheckListBox1: TCheckListBox;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  chosenDirectory : string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit2.Text <> '' then
    begin
      CheckListBox1.Items.Add(Edit2.Text);
      Edit2.Text := '';
      Edit2.SetFocus;
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
s: string;
begin
  if SelectDirectory('Select a directory', s, s, []) then
    Edit1.Text:= s
  else
    if MessageBox(Handle, 'Anulowano wybieranie lokalizacji do przeszukania',
      'Przeszukiwacz logów', MB_ICONINFORMATION or MB_OK) = IDOK then
      Exit;
end;


procedure TForm1.Button4Click(Sender: TObject);
var
  i: integer;
begin
  for i := CheckListBox1.Count - 1 downto 0 do
    if CheckListBox1.Checked[i] then
    begin
      CheckListBox1.Selected[i] := True;
      CheckListBox1.DeleteSelected;
    end;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  CheckListBox1.Clear;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  Edit1.Clear;
  Edit2.Clear;
  CheckListBox1.Clear;
  Memo1.Clear;
  Memo2.Clear;
  Edit1.SetFocus;
end;
end.

【问题讨论】:

标签: delphi delphi-10.1-berlin


【解决方案1】:

如果要选择多个文件进行搜索:

        uses System.IOUtils;
        ...
        ...


procedure    TForm88.Button2Click(Sender: TObject);
        
            var
              files: TStringDynArray;
              I: Integer;
            begin
                 ListBox1.Items.Clear;
                 files := TDirectory.GetFiles('c:\windows','*.log');
                 begin
                   for i := 0 to Length(files)-1 do
                   begin
                     ListBox1.Items.Add(files[i])
                     // your string search code here
                   end;
                end;
            end;

【讨论】:

  • 理想情况下,您应该使用BeginUpdate..EndUpdate(带有try..finally 保护),否则如果文件很多,这将非常慢。这对性能确实很重要。
猜你喜欢
  • 2015-04-10
  • 2013-02-11
  • 2011-11-19
  • 1970-01-01
  • 2017-09-10
  • 2020-01-02
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多