监控文件变化

ContractedBlock.gif ExpandedBlockStart.gif Code
unit FileSysThread;

interface

uses
  Windows, SysUtils, Classes, comctrls;

type
  TFileSysNotifyThread 
= class(TThread)
  
private
    ErrCode: Integer;
    KillAddress: PInteger;
    NotifyHandle: THandle;
    WatchPath: 
string;
    WatchMask: Integer;
    
procedure SignalFileNotification;
  
protected
    
procedure Execute; override;
  
public
    
constructor Create(const AWatchPath: string; AWatchMask: Integer; var
      Myself: TFileSysNotifyThread);
    
destructor Destroy; override;
  
end;

implementation

uses Dialogs;

constructor TFileSysNotifyThread.Create(const AWatchPath: string; AWatchMask:
  Integer; 
var Myself: TFileSysNotifyThread);
begin
  
inherited Create(True);
  WatchPath :
= AWatchPath;
  WatchMask :
= AWatchMask;
  KillAddress :
= Addr(Myself);
  Priority :
= tpLower;
  FreeOnTerminate :
= True;
  Suspended :
= False;
end;

destructor TFileSysNotifyThread.Destroy;
begin
  
if NotifyHandle <> THandle(-1then
    FindCloseChangeNotification(NotifyHandle);
  
inherited Destroy;
  KillAddress^ :
= 0;
end;

procedure TFileSysNotifyThread.Execute;
begin
  NotifyHandle :
= FindFirstChangeNotification(PChar(WatchPath), False,
    WatchMask);
  
if NotifyHandle <> THandle(-1then
    
while not Terminated do
    
begin
      ErrCode :
= WaitForSingleObject(NotifyHandle, 250);
      
case ErrCode of
        Wait_Timeout:
          ;
        Wait_Object_
0:
          
begin
            Synchronize(SignalFileNotification);
            FindNextChangeNotification(NotifyHandle);
          
end;
      
else
        ;
      
end;
    
end;
end;

procedure TFileSysNotifyThread.SignalFileNotification;
begin
  ShowMessage(
'文件已改变!');
end;

end.

unit Test;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, FileSysThread;

type
  TForm1 
= class(TForm)
    Button1: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    
procedure Button1Click(Sender: TObject);
    
procedure Button3Click(Sender: TObject);
    
procedure FormDestroy(Sender: TObject);
  
private
    
{ Private declarations }
    MyThread1: TFileSysNotifyThread;
  
public
    
{ Public declarations }
  
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  
if MyThread1 = nil then
    MyThread1 :
= TFileSysNotifyThread.Create(edit1.text,
      File_Notify_Change_File_Name 
or File_Notify_Change_Dir_Name, MyThread1)
  
else
    ShowMessage(
'线程正在运行');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  
if MyThread1 <> nil then
    MyThread1.Terminate
  
else
    ShowMessage(
'线程未运行');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  
if MyThread1 <> nil then
  
begin
    MyThread1.Terminate;
    MyThread1.WaitFor;
  
end;
end;

end.

转载于:https://www.cnblogs.com/chengxin1982/archive/2009/11/10/1599439.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值