频道分类

delphi 实现批量文件名修改

作者:admin 来源: 日期:2021/6/7 16:14:17 人气: 标签:

 unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, RzButton, Vcl.ImgList,
  Vcl.ExtCtrls, RzShellDialogs,
  System.IOUtils, System.Types, Vcl.ComCtrls, RzListVw,
  System.RegularExpressionsCore, RzCommon;

type
  TForm1 = class(TForm)
    btn1: TButton;
    LabeledEdit1: TLabeledEdit;
    lbledt1: TLabeledEdit;
    btn2: TButton;
    ImageList1: TImageList;
    rzbtbtn1: TRzBitBtn;
    RzSelectFolderDialog1: TRzSelectFolderDialog;
    lst1: TRzListView;
    lbl1: TLabel;
    ini1: TRzRegIniFile;
    lbl2: TLabel;
    procedure rzbtbtn1Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    FPath: string;
    function replace(str, regx, replacement: string): string;
  public
    { Public declarations }
    procedure ControlEnable(AEnable: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  item: TListItem;
begin
  // lst1.items.BeginUpdate;
  for item in lst1.Items do
  begin
    item.SubItems.Clear;
    item.SubItems.Add(replace(item.Caption, LabeledEdit1.Text, lbledt1.Text))
  end;
  // lst1.items.EndUpdate;
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  vFiles: TStringDynArray;
  vFile, vDest, vSrc: string;
  vPath: string;
begin
  // begin replace
  ControlEnable(False);
  vFiles := TDirectory.GetFiles(Self.FPath);
  for vSrc in vFiles do
  begin
    lbl2.Caption := '重命名:' + vSrc;
    vPath := ExtractFilePath(vSrc);
    vFile := ExtractFileName(vSrc);
    vDest := replace(vFile, LabeledEdit1.Text, lbledt1.Text);
    if vFile = vDest then
      Continue;
    vDest := vPath + '\' + vDest;
    try
      TFile.Move(vSrc, vDest);
    except
      ShowMessage('文件:【' + vSrc + '】改名失败!');
    end;
  end;
  // end

  ControlEnable(true);
  lst1.Items.BeginUpdate;
  lst1.Items.Clear;
  vFiles := TDirectory.GetFiles(Self.FPath);
  for vFile in vFiles do
  begin
    lst1.Items.Add.Caption := ExtractFileName(vFile)
  end;
  lst1.Items.EndUpdate;
end;

procedure TForm1.ControlEnable(AEnable: Boolean);
begin
  rzbtbtn1.Enabled := AEnable;
  LabeledEdit1.Enabled := AEnable;
  lbledt1.Enabled := AEnable;
  btn1.Enabled := AEnable;
  btn2.Enabled := AEnable;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ini1.WriteString('cfg', 'regx', LabeledEdit1.Text);
  ini1.WriteString('cfg', 'rep', lbledt1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LabeledEdit1.Text := ini1.ReadString('cfg', 'regx', LabeledEdit1.Text);
  lbledt1.Text :=  ini1.ReadString('cfg', 'rep', lbledt1.Text);
end;

function TForm1.replace(str, regx, replacement: string): string;
var
  reg: TPerlRegEx; // 声明正则表达式变量
begin
  reg := TPerlRegEx.Create(); // 建立
  reg.Subject := str; // 这是要替换的源字符串
  reg.RegEx := regx; // 这是表达式, 在这里是准备替换掉的子串
  reg.replacement := replacement;
  reg.Options := [preCaseLess]; // 不区分大小的设定, 默认是区分的
  reg.ReplaceAll; // 执行全部替换
  Result := reg.Subject;
  FreeAndNil(reg); // 或 reg.Free
end;

procedure TForm1.rzbtbtn1Click(Sender: TObject);
var
  vFiles: TStringDynArray;
  vFile: string;
begin
  lst1.Items.BeginUpdate;
  lst1.Items.Clear;
  if RzSelectFolderDialog1.Execute then
  begin
    Self.FPath := RzSelectFolderDialog1.SelectedPathName;
    lbl1.Caption := '当前目录:' + Self.FPath;
    vFiles := TDirectory.GetFiles(Self.FPath);
    for vFile in vFiles do
    begin
      lst1.Items.Add.Caption := ExtractFileName(vFile)
    end;
  end;
  lst1.Items.EndUpdate;
end;

end.