首页 > 编程语言 >DELPHI 文件自动备份工具源码分享

DELPHI 文件自动备份工具源码分享

时间:2023-08-19 20:11:06浏览次数:32  
标签:begin end string DELPHI TObject 源码 备份 procedure Sender

一.工具界面如下(没做UI)

 

二.设计视图如下:

 三.控件说明:

  1.使用到了第三方StyleControl控件中的SCGPLabel,SCGPEdit,SCGPCheckBox,SCGPCombobox,SCGPButton,这几个控件如果需要,可替换成秕自带控件.难度-1

  2.TrayIcon 这个是让程序缩小到托盘上面去的.

  3.PopupMenu 菜单控件.程序缩小到托盘上时,右键可弹出菜单,如下图  

   4.其他控件,略

 

四.功能说明

   1: 定时备份到指定目录

    2:勾选检查MD5值时,会对最近一次备份的文件与目标文件做MD5文件比较,如果MD5值不一致,则进行备份操作.否则不备份

   3.勾选开机启动可以开机自动运行

   4.记忆用户设置.关闭程序时,ini文件保存到程序目录下.启动时读取此ini文件,恢复用户设置

   5.点击开始后,自动缩小到托盘.托盘右键有菜单.或者双击托盘图标可显示程序界面

 6.目前时间间隔只支持30分钟/1小时/3小时/6小时/12小时.暂时不支持自定义,有朋友需要的话可以二次开发,源码会在下面分享

五.源码分享

unit FMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.ExtCtrls, scControls, scGPControls, scGPExtControls, Vcl.StdCtrls,
  Vcl.Mask, Vcl.Menus, System.ImageList, Vcl.ImgList, FileCtrl,
  IdHashMessageDigest, IOUtils, IdHash, DateUtils, System.Types, Registry,
  IniFiles, IdGlobal;

type
  TMD5 = class(TIdHashMessageDigest5);   //注意这里

  TForm2 = class(TForm)
    scGPEdit1: TscGPEdit;
    scGPLabel1: TscGPLabel;
    scGPLabel2: TscGPLabel;
    scGPComboBox1: TscGPComboBox;
    BeginButton: TscGPButton;
    OpenDialog1: TOpenDialog;
    Timer1: TTimer;
    scGPEdit2: TscGPEdit;
    scGPLabel3: TscGPLabel;
    scGPCheckBox1: TscGPCheckBox;
    TrayIcon1: TTrayIcon;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    ImageList1: TImageList;
    scGPCheckBox2: TscGPCheckBox;
    procedure scGPEdit2RightButtonClick(Sender: TObject);
    procedure scGPEdit1RightButtonClick(Sender: TObject);
    procedure BeginButtonClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure scGPCheckBox2Click(Sender: TObject);
    procedure TrayIcon1DblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
                { Private declarations }
  public
                { Public declarations }
    procedure AppendRecordToFile(RecordContent: string);
    procedure SetStartupRegistry(EnableStartup: Boolean);
    procedure SaveSettings(const FileName: string; FilePath, FolderPath: string);
    procedure LoadSettings(const FileName: string; var FilePath, FolderPath: string);
    function GetLatestFileMD5(const filePath, folderPath: string): string;
    function StreamToMD5(const FilePatn: string): string;
  end;

var
  Form2: TForm2;
  filePath: string;     //文件路径
  FolderPath: string;    //备份目录

implementation

{$R *.dfm}

procedure TForm2.BeginButtonClick(Sender: TObject);
var
  i: Cardinal;
begin
  if BeginButton.Caption = '停止' then
  begin
    AppendRecordToFile(FormatDateTime('yyyymmdd hhmmss', Now()) + ' 任务被停止');
    BeginButton.Caption := '开始';
    Timer1.Enabled := false;
  end
  else
  begin
    //检查是否已指定文件与保存目录
    filePath := scGPEdit1.Text;
    FolderPath := scGPEdit2.Text;
    if (filePath = '') or (FolderPath = '') then
    begin
      ShowMessage('请先选择要备份的文件与存放备份文件的目录');
      exit;
    end;
    //如果文件名不存在,则提示文件名不存在,然后退出程序
    if not FileExists(filePath) then
    begin
      ShowMessage('指定的 文件 不存在,请检查');
      exit;
    end;
    //检查目录是否存在
    if not DirectoryExists(FolderPath) then
    begin
      ShowMessage('指定的 文件夹路径 不存在,请检查');
      exit;
    end;

    BeginButton.Caption := '停止';
    case scGPComboBox1.ItemIndex of
      0:
        i := 30 * 60 * 1000;
      1:
        i := 60 * 60 * 1000;
      2:
        i := 3 * 60 * 60 * 1000;
      3:
        i := 6 * 60 * 60 * 1000;
      4:
        i := 12 * 60 * 60 * 1000;
    end;

    AppendRecordToFile(FormatDateTime('yyyy-mm-dd hh:mm:ss', Now()) + '  开始执行备份任务;');
    Timer1.Interval := i;     //设置时间间隔 ,测试时写个几秒即可
    Timer1.Enabled := True;   //启动计时器
    //隐藏到托盘
    TrayIcon1.Visible := True; // 显示托盘图标
    TrayIcon1.PopUpMenu := PopupMenu1; // 将弹出菜单关联到托盘图标上
    Self.Hide;
  end;
end;

procedure TForm2.scGPCheckBox2Click(Sender: TObject);   //选择备份目录
begin
  if scGPCheckBox2.STATE = cbChecked then
    SetStartupRegistry(TRUE) //设置开机启动
  else
    SetStartupRegistry(false) //取消开机启动
end;

procedure TForm2.scGPEdit1RightButtonClick(Sender: TObject);
begin
  OpenDialog1.Options := [ofHideReadOnly, ofFileMustExist];    //对话框设置:隐藏只读文件,文件必须存在.不需要的可以注释掉
  if OpenDialog1.Execute then
    scGPEdit1.Text := OpenDialog1.FileName;   //返回用户选中的文件路径到文本框
end;

procedure TForm2.scGPEdit2RightButtonClick(Sender: TObject);
var
  Dir: string;
begin
  if SelectDirectory('请选择目录 ', ' ', Dir) then // Dir存储着用户选择的目录名称
    scGPEdit2.Text := Dir;        //返回用户选中的文件夹路径到文本框
end;

procedure TForm2.Timer1Timer(Sender: TObject);   //计时器
var
  NewMD5, OldMD5: string;
  FileStream: TFileStream;
  MD5Hash: TIdHashMessageDigest5;
  logStr: string;
begin
  logStr := FormatDateTime('yyyymmdd hhmmss', Now());
  if scGPCheckBox1.State = cbChecked then //如果勾选了检查MD5值
  begin
   //取到目标文件的MD5值
    FileStream := TFileStream.Create(FilePath, fmOpenRead or fmShareDenyNone);
    try
      MD5Hash := TIdHashMessageDigest5.Create;
      try
        NewMD5 := MD5Hash.HashStreamAsHex(FileStream);
      finally
        MD5Hash.Free;
      end;
    finally
      FileStream.Free;
    end;
    AppendRecordToFile('目标文件MD5值:' + NewMD5);    //输出日志到备份日志
    //获取到最近备份文件的MD5值 .
    OldMD5 := GetLatestFileMD5(FilePath, FolderPath);
    AppendRecordToFile('最新文件MD5值:' + OldMD5);
    //如果OldMD5的值等于NewMD5值,说明数据库没有变化,不需要进行备份
    if NewMD5 = OldMD5 then
    begin
      AppendRecordToFile(logStr + 'MD5值未发生改变,不进行备份操作');
      exit;
    end
    else
      AppendRecordToFile(logStr + 'MD5值有变动,进行备份操作');
  end;

  //开始备份
  //TPath.Combine 方法来组合目标目录 FolderPath 和新的文件名。这样可以确保目标文件的完整路径,它会自动加"\"。
  //使用 TPath.GetExtension 方法获取源文件的扩展名,并将其与新的文件名进行组合。
  TFile.Copy(filePath, TPath.Combine(FolderPath, logStr + TPath.GetExtension
    (filePath)));
  AppendRecordToFile(logStr + ' 备份完成');
end;

procedure TForm2.TrayIcon1DblClick(Sender: TObject);  //双击时显示界面
begin
  self.Show;
end;

procedure TForm2.AppendRecordToFile(RecordContent: string);   //追加文本信息到日志文件
var
  FullPath: string;
  FileWriter: TStreamWriter;
begin
  FullPath := TPath.Combine(FolderPath, '备份日志.txt');
  FileWriter := TStreamWriter.Create(FullPath, FileExists(FullPath));
  try
    FileWriter.WriteLine(RecordContent);
  finally
    FileWriter.Free;
  end;
end;

function TForm2.GetLatestFileMD5(const filePath, folderPath: string): string;  //找到最近备份文件,并返回MD5
var
  FileType: string;
  SearchRec: TSearchRec;
  CreateTime, LatestCreateTime: TDateTime;
  FullPath, LatestFilePath: string;
begin
  Result := '';
  FileType := '*' + TPath.GetExtension(filePath); // 获取文件扩展名,与*构成模糊匹配
  FullPath := TPath.Combine(folderPath, FileType);  //带路径的文件名
  //第一个文件,默认它是最新的文件,然后再慢慢遍历
  if FindFirst(FullPath, faAnyFile, SearchRec) = 0 then
  begin
    FullPath := TPath.Combine(folderPath, SearchRec.Name);
    LatestCreateTime := Tfile.GetCreationTime(FullPath);   //文件的创建时间
    LatestFilePath := FullPath;                              //文件路径
    // 遍历文件夹中的文件
    while FindNext(SearchRec) = 0 do
    begin
      // 比较文件的创建时间,并更新最新文件的信息
      FullPath := TPath.Combine(folderPath, SearchRec.Name);
      CreateTime := Tfile.GetCreationTime(FullPath);   //文件的创建时间
      if CreateTime > LatestCreateTime then    //比较两个文件的创建时间
      begin
        LatestFilePath := FullPath;   //记录更近的备份文件的文件名
        LatestCreateTime := CreateTime;  //  记录更近的备份文件的创建时间
      end;
    end;

    // 将最新文件的路径传递给 StreamToMD5() 函数来计算 MD5
    Result := StreamToMD5(LatestFilePath);
  end;

  FindClose(SearchRec);  //关闭记录类型
end;

procedure TForm2.N1Click(Sender: TObject);  //显示 菜单
begin
  Self.Show;
end;

procedure TForm2.N2Click(Sender: TObject);  //关于 菜单
begin
  ShowMessage('制作人:甘兴鹏 QQ:452428745')
end;

procedure TForm2.N3Click(Sender: TObject);   //退出 菜单
begin
  TrayIcon1.Visible := False;   //关闭前,设置托盘不可见,不然退出了还会有个图标显示在那里
  Close;
end;

procedure TForm2.SetStartupRegistry(EnableStartup: Boolean);  //设置开机启动
var
  Reg: TRegistry;
begin
  //ExtractFileName(ParamStr(0)) 来获取当前程序的文件名作为注册表键名和值。
  //ParamStr(0) 返回当前程序的完整路径
  //ExtractFileName 函数提取出程序的文件名部分。
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True) then   //仅于WIN10测试
    begin
      if EnableStartup then
        Reg.WriteString(ExtractFileName(ParamStr(0)), ParamStr(0)) // 将程序路径设置为开机启动项的值,键名为程序名称
      else
        Reg.DeleteValue(ExtractFileName(ParamStr(0))); // 删除开机启动项的值,键名为程序名称
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;
// 保存设置到配置文件

procedure TForm2.SaveSettings(const FileName: string; FilePath, FolderPath: string);
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create(FileName);
  try
    IniFile.WriteString('Settings', 'FilePath', scGPEdit1.Text);
    IniFile.WriteString('Settings', 'FolderPath', scGPEdit2.Text);
  finally
    IniFile.Free;
  end;
end;

// 从配置文件中读取设置
procedure TForm2.LoadSettings(const FileName: string; var FilePath, FolderPath: string);
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create(FileName);
  try
    scGPEdit1.Text := IniFile.ReadString('Settings', 'FilePath', '');
    scGPEdit2.Text := IniFile.ReadString('Settings', 'FolderPath', '');
  finally
    IniFile.Free;
  end;
end;

// 在程序启动时自动读取设置
procedure TForm2.FormCreate(Sender: TObject);
var
  AppPath: string;
  ConfigFile: string;
  FilePath, FolderPath: string;
begin
  AppPath := ExtractFilePath(Application.ExeName);
  ConfigFile := AppPath + 'config.ini';
  FilePath := scGPEdit1.Text;
  FolderPath := scgpEdit2.Text;
  if FileExists(ConfigFile) then
    LoadSettings(ConfigFile, FilePath, FolderPath);
end;

// 在程序关闭时保存设置
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var
  AppPath: string;
  ConfigFile: string;
begin
  AppPath := ExtractFilePath(Application.ExeName);
  ConfigFile := AppPath + 'config.ini';

  SaveSettings(ConfigFile, scGPEdit1.Text, scgpEdit2.Text);
end;

function TForm2.StreamToMD5(const FilePatn: string): string;   //取文件的MD5值
var
  MD5Encode: TMD5;
  filesen: TFileStream;
begin
  MD5Encode := TMD5.Create;
  try
    filesen := TFileStream.Create(FilePatn, fmopenread or fmshareExclusive);
    result := MD5Encode.HashStreamAsHex(filesen);
  finally
    MD5Encode.Free;
    filesen.Free
  end;
end;

end.

 

标签:begin,end,string,DELPHI,TObject,源码,备份,procedure,Sender
From: https://www.cnblogs.com/yoooos/p/17643011.html

相关文章

  • 精读 classnames源码,解读重点功能的实现【玩转源码】
    前言本文主要讲解classnames相关的知识点。对classnames源码,按照功能模块进行解读。尤其对于源码中关键代码从实现层面做了解读。在总结过程中,对CSS-in-JS写法有了不同的想法,结合大佬的文章,将想法记录在了文末。classnames的原理源码目录功能模块目录结构classnames┣......
  • Delphi获取文件创建时间、文件最后修改时间
    procedureTForm1.Button1Click(Sender:TObject);//获取文件创建时间varFileName:string;ti:Integer;dt:TDateTime;beginFileName:='D:\test\Test.txt';ti:=FileAge(FileName);ShowMessage(IntToStr(ti));//返回:1030115371,需要转换dt:=F......
  • 劳务实名制 工地劳务管理系统智慧工地 信息化可视系统源码
    智慧工地管理云平台系统是一种利用人工智能和物联网技术来监测和管理建筑工地的系统。它可以通过感知设备、数据处理和分析、智能控制等技术手段,实现对工地施工、设备状态、人员安全等方面的实时监控和管理。智慧工地平台系统工作原理:1、感知设备的部署智慧工地智能监控系统会在工......
  • 国际多语言出海商城源码/返佣产品自动匹配拼单商城源码
    源码介绍:国际多语言出海商城返佣产品自动匹配订单拼单商城源码,8国多语言出海拼单商城。此网站是很多巴西客户定制的原型,已投放运营符合当地本地化。多语言商城返利返佣投资理财派单自带余额宝,采取全新支付端口,后台语音提醒,客服中心改造豪华页面,赠送客服系统。后台釆取全新框架,余额......
  • 智慧建筑工地平台源码,数字化项目管理云平台源码
    智慧工地管理平台源码智慧工地管理平台是以物联网、移动互联网技术为基础,充分应用大数据、人工智能、移动通讯、云计算等信息技术,利用前端信息采通过人机交互、感知、决策、执行和反馈等,实现对工程项目內人员、车辆、安全、设备、材料等的智能化管理,是信息技术、人工技术与工程施工......
  • PostgreSQL 源码性能诊断(perf profiling)指南(含火焰图生成分析FlameGraph) - 珍藏级
    PostgreSQL源码性能诊断(perfprofiling)指南(含火焰图生成分析FlameGraph)-珍藏级作者digoal日期2016-11-28标签PostgreSQL,Linux,perf,性能诊断,stap,systemtap,strace,dtrace,dwarf,profiler,perf_events,probe,dynamicprobe,tracepoint......
  • 基于Redis的Geo实现附近商铺搜索(含源码)
    微信公众号访问地址:基于Redis的Geo实现附近商铺搜索(含源码)一、GEO常用命令及使用示范1.1、GEO的数据结构GEO 就是 Geolocation 的简写形式,代表地理坐标。Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:1、GEOAD......
  • 学浪、荔枝微课平台的平替,兔知云课堂知识付费源码
    经历了雪浪下架风波后,我们深刻认识到“鸡蛋不能放在一个篮子里”的道理。尽管现在已经恢复正常,但这段经历仍然促使我们在寻找其他课程上架平台的同时,审慎对待不同的推销信息。作为知识付费领域的一份子,我希望分享一款备受认可的私域场景下的知识付费解决方案——兔知云课堂。如果......
  • 基于JAVA+hadoop网络云盘上传下载系统-计算机毕业设计源码+LW文档
    摘 要随着信息技术的发展,管理系统越来越成熟,各种企事业单位使用各种类型的管理系统来提高工作效率,从而降低手工劳动的弊端。网络云盘能够为广大用户提供安全、免费、方便的存储空间,还能实现资源的共享,但是网络云盘还是存在不足,如何为用户提供更简单明了、便于操作的云盘空间就......
  • 高等学校国防教育教学素材管理系统-计算机毕业设计源码+LW文档
    摘要随着信息技术的发展,管理系统越来越成熟,各种企事业单位使用各种类型的管理系统来提高工作效率,从而降低手工劳动的弊端。我国政府一直以来都非常重视国防教育事业的发展,近几年来高校学生人数逐渐增加,学校对图书馆国防教育教学素材信息、借阅信息的管理也愈发的困难。因此,高校提......