资料地址:

1.https://www.cnblogs.com/studypanp/p/4890970.html

单元代码:

 (******************************************
文件和目录监控
当磁盘上有文件或目录操作时,产生事件
使用方法: 开始监控: PathWatch(Self.Handle, 'C:\FtpFolder');
解除监控:PathWatch(-1); 在窗体中加消息监听
private
{ Private declarations }
procedure MsgListern(var Msg:TMessage);message WM_SHNOTIFY; 实现:
procedure TForm1.MsgListern(var Msg:TMessage);
begin
PathWatch(Msg,procedure(a,s1,s2:String) begin
Log('文件事件是:' +a);
Log('文件名称是:' +s1);
Log('另外的参数是:'+s2);
end);
end;
原始资料:https://www.cnblogs.com/studypanp/p/4890970.html
环境情况:win7 + DelphiXE10.
更新情况:修改20190315 增加多目录处理
******************************************)
unit ZJQPathWatch; interface uses
Winapi.Messages, System.SysUtils, FMX.Types, FMX.Platform.Win, WinAPI.ShlObj,
Winapi.ActiveX, WinApi.Windows, VCL.Dialogs,
System.Classes;//TStringList const
WM_SHNOTIFY = $; type
PIDLSTRUCT = ^IDLSTRUCT;
_IDLSTRUCT = record
pidl : PItemIDList;
bWatchSubFolders : Integer;
end;
IDLSTRUCT =_IDLSTRUCT; type
PSHNOTIFYSTRUCT=^SHNOTIFYSTRUCT;
SHNOTIFYSTRUCT = record
dwItem1 : PItemIDList;
dwItem2 : PItemIDList;
end; Function SHChangeNotifyDeregister(hNotify:integer):integer;stdcall; external 'Shell32.dll' index ;
Function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMSG,cItems:LongWord;lpps:PIDLSTRUCT):integer;stdcall; external 'Shell32.dll' index ; function PathWatch(hWND: Integer; Path:String = ''):Boolean; overload;
function PathWatch(hWND: TWindowHandle; Path:String = ''):Boolean; overload;
function PathWatch(var Msg: TMessage; callback: TProc<String, String, String>): Boolean; overload; var
g_HSHNotify: Integer;
g_pidlDesktop: PItemIDList;
g_WatchPath: String;
g_WatchPathList: TStringList; implementation function GetPathIsExist(AWatchPathList: TStringList; APath: string): Boolean;
var
I: Integer;
begin
Result := False;
for I := to AWatchPathList.Count - do
begin
if APath.ToUpper.StartsWith(AWatchPathList[I]) then
begin
Result := True;
Break;
end;
end;
end; function PathWatch(hWND: Integer; Path: String = ''): Boolean;
var
ps:PIDLSTRUCT;
begin
result := False;
Path := Path.Replace('/','\');
if(hWnd >= ) then begin // 开始监控
// g_WatchPath := Path.ToUpper;
g_WatchPathList.Add(Path.ToUpper); if g_HSHNotify = then begin
SHGetSpecialFolderLocation(, CSIDL_DESKTOP, g_pidlDesktop);
if Boolean(g_pidlDesktop) then
begin
getmem(ps, sizeof(IDLSTRUCT));
ps.bWatchSubFolders := ;
ps.pidl := g_pidlDesktop;
g_HSHNotify := SHChangeNotifyRegister(hWnd, (SHCNF_TYPE Or SHCNF_IDLIST),(SHCNE_ALLEVENTS Or SHCNE_INTERRUPT),WM_SHNOTIFY, , ps);
Result := Boolean(g_HSHNotify);
end
else
CoTaskMemFree(g_pidlDesktop);
end;
end
else
begin // 解除监控
if boolean(g_HSHNotify) then if Boolean(SHChangeNotifyDeregister(g_HSHNotify)) then begin
g_HSHNotify := ;
CoTaskMemFree(g_pidlDesktop);
result := True;
end;
end;
end; function PathWatch(hWND: TWindowHandle; Path:String=''):Boolean;
begin
PathWatch(FmxHandleToHWND(hWND),Path); // FireMonkey的窗体不接受处理Windows消息
end; function PathWatch(var Msg: TMessage; callback:TProc<String, String, String>): Boolean;
var
a, s1, s2: String;
buf: array[..MAX_PATH] of char;
pidlItem: PSHNOTIFYSTRUCT;
begin
pidlItem := PSHNOTIFYSTRUCT(Msg.WParam);
SHGetPathFromIDList(pidlItem.dwItem1, buf); s1 := buf;
SHGetPathFromIDList(pidlItem.dwItem2, buf); s2 := buf;
a:='';
case Msg.LParam of
// SHCNE_RENAMEITEM : a := '重命名' ;
SHCNE_CREATE : a := '建立文件' ;
// SHCNE_DELETE : a := '删除文件' ;
SHCNE_MKDIR : a := '新建目录' ;
// SHCNE_RMDIR : a := '删除目录' ;
// SHCNE_ATTRIBUTES : a := '改变属性' ;
// SHCNE_MEDIAINSERTED : a := '插入介质' ;
// SHCNE_MEDIAREMOVED : a := '移去介质' ;
// SHCNE_DRIVEREMOVED : a := '移去驱动器' ;
// SHCNE_DRIVEADD : a := '添加驱动器' ;
// SHCNE_NETSHARE : a := '改变共享' ;
// SHCNE_UPDATEDIR : a := '更新目录' ;
// SHCNE_UPDATEITEM : a := '更新文件' ;
// SHCNE_SERVERDISCONNECT: a := '断开连接' ;
// SHCNE_UPDATEIMAGE : a := '更新图标' ;
// SHCNE_DRIVEADDGUI : a := '添加驱动器' ;
// SHCNE_RENAMEFOLDER : a := '重命名文件夹' ;
// SHCNE_FREESPACE : a := '磁盘空间改变' ;
// SHCNE_ASSOCCHANGED : a := '改变文件关联' ;
// else a := '其他操作' ; end;
result := True; if( (a<>'') and (Assigned(callback)) and (GetPathIsExist(g_WatchPathList, s1))) and (not s1.Contains('_plate')) then
begin
callback(a,s1,g_WatchPath);
end;
end; initialization
g_WatchPathList := TStringList.Create;
finalization
FreeAndNil(g_WatchPathList); end.

调用代码:

 unit Unit1;

 interface

 uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
ZJQPathWatch,//引入
System.DateUtils;//引入 type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure MsgListern(var Msg: TMessage); message WM_SHNOTIFY;// 触发监听事件
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1;
PrePostTime: TDateTime; //定义原始时间
implementation {$R *.dfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject);
begin
PathWatch(self.Handle, 'e:\ABC');
PathWatch(self.Handle, 'E:\abd'); // PathWatch(self.Handle, '\\gccp-builder8\builder_release');
end; procedure TForm1.Button2Click(Sender: TObject);
begin
PathWatch(-);
end; procedure TForm1.FormCreate(Sender: TObject);
begin
PrePostTime := Now;
end; procedure TForm1.MsgListern(var Msg: TMessage);
var
I: Integer;
begin
PathWatch(Msg, Procedure(act, fn, s2: string) begin
if(act='建立文件') then
begin
if SecondsBetween(Now, PrePostTime) >= then //两个时间之间相差的秒数
begin
// 这里处理监控到后 要响应的事情
I := I + ;
end;
end;
if(act='新建目录') then
begin
if SecondsBetween(Now, PrePostTime) >= then //两个时间之间相差的秒数
begin
// 这里处理监控到后 要响应的事情
I := I + ;
end;
end;
end);
end; end.

Delphi目录监控、目录监听的更多相关文章

  1. zabbix 监控机器监听的端口 + 触发器 表达式理解

    在zabbix web 页面配置item,监控监听的21端口 配置trigger 参考:http://www.cnblogs.com/saneri/p/6126786.html 5. {www.zab ...

  2. jfinal中如何使用过滤器监控Druid监听SQL执行?

    摘要:最开始我想做的是通过拦截器拦截SQL执行,但是经过测试发现,过滤器至少可以监听每一个SQL的执行与返回结果.因此,将这一次探索过程记录下来. 本文分享自华为云社区<jfinal中使用过滤器 ...

  3. Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键

    在Android系统中用来显示界面的组件(Component)为Activity,也就是说只有重写Activity的onKeyDown方法来监控/拦截/屏蔽系统的返回键(back).菜单键(Menu) ...

  4. C# FileSystemWatcher监听文件事件

    现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...

  5. Java实现系统目录实时监听更新。

    SDK1.7新增的nio WatchService能完美解决这个问题.美中不足是如果部署在window系统下会出现莫名其妙的文件夹占用异常导致子目录监听失效,linux下则完美运行.这个问题着实让人头 ...

  6. Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: 对文件系统的访问提供了全面的支持 提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的Ja ...

  7. FileSystemWatcher监听文件事件

    现有一个需求如下:监控某个目录中的文件修改,创建,删除等信息,并记录下来. 这里用到FileSystemWatcher类.由于考虑到文件的写入量会很频率,所以考虑先将监听到的消息记录到内存中. 监听部 ...

  8. c# 监听文件夹动作

    static FileSystemWatcher watcher = new FileSystemWatcher(); /// <summary>        /// 初始化监听     ...

  9. Spring之事件监听(观察者模型)

    目录 Spring事件监听 一.事件监听案例 1.事件类 2.事件监听类 3.事件发布者 4.配置文件中注册 5.测试 二.Spring中事件监听分析 1. Spring中事件监听的结构 2. 核心角 ...

  10. Oracle 数据库监听配置和服务

    -- 补充说明 如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) PLSQL Dev ...

随机推荐

  1. mac上生成目录结构

    brew又叫Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件. 一.安装brew ruby -e "$(curl -fsSL https://ra ...

  2. 纯几何题 --- UVA - 11646 Athletics Track

    这一题题目有点坑,注意这句话: 这代表了其圆心就是矩形的中心! 然后就可以推公式: 可知: x = 200/(a+2atan(b/c)*r); r = sqrt(a*a + b*b); 所以有AC代码 ...

  3. BZOJ.3811.玛里苟斯(线性基)

    BZOJ UOJ 感觉网上大部分题解对我这种数学基础差的人来说十分不友好...(虽然理解后也觉得没有那么难) 结合两篇写的比较好的详细写一写.如果有错要指出啊QAQ https://blog.csdn ...

  4. JavaScript基础笔记(四) JS式面向对象

    JS式面向对象 一.理解对象 一)属性类型 ECMA-262 第 5 版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征. ECMA-262 定义这些特性是为 ...

  5. Scrapy基础(四)————Scrapy的使用Pycharm进行Debuge设置

    好比Django的Debuge 与前端进行交互时的方便,但是Scrapy 不自带,所以我们写一个main文件来debuge 作用:通过cmd 命令启动爬虫 #-*-coding:utf-8 -*- # ...

  6. 狡猾的商人 [HNOI2005] [一题双解]

    Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 ...

  7. JS 模仿块级作用域

    function outputNumbers(count) { for (var i=0; i<count; i++) { console.log(i); } var i;  // 重新声明变量 ...

  8. php 数组模糊匹配

    php 数组模糊匹配: $list = array(); // 匹配后的结果 $arr = array("abcd","abef","efgh&quo ...

  9. java文件课后动手动脑

    package 第九周作业1; import java.io.File; import java.io.FileInputStream; import java.io.IOException; imp ...

  10. UIButton高亮状态卡顿

    童鞋们有么有遇到过一个tableview或者是scrollview上放置一个button然后点击button,但是button的高亮状态切换不过来呢? 解决方案: 新建一个类继承自UITableVie ...