1. (******************************************
  2. 文件和目录监控
  3. 当磁盘上有文件或目录操作时,产生事件
  4. 使用方法:
  5.  
  6. 开始监控: PathWatch(Self.Handle, 'C:\FtpFolder');
  7. 解除监控:PathWatch(-1);
  8.  
  9. 在窗体中加消息监听
  10. private
  11. { Private declarations }
  12. procedure MsgListern(var Msg:TMessage);message WM_SHNOTIFY;
  13.  
  14. 实现:
  15. procedure TForm1.MsgListern(var Msg:TMessage);
  16. begin
  17. PathWatch(Msg,procedure(a,s1,s2:String) begin
  18. Log('文件事件是:' +a);
  19. Log('文件名称是:' +s1);
  20. Log('另外的参数是:'+s2);
  21. end);
  22. end;
  23.  
  24. ******************************************)
  25. unit PathWatch;
  26.  
  27. interface
  28.  
  29. uses
  30. Winapi.Messages, System.SysUtils, FMX.Types, FMX.Platform.Win, WinAPI.ShlObj,
  31. Winapi.ActiveX, WinApi.Windows, VCL.Dialogs
  32. ;
  33.  
  34. const
  35. WM_SHNOTIFY = $401;
  36.  
  37. type
  38. PIDLSTRUCT = ^IDLSTRUCT;
  39. _IDLSTRUCT = record
  40. pidl : PItemIDList;
  41. bWatchSubFolders : Integer;
  42. end;
  43. IDLSTRUCT =_IDLSTRUCT;
  44. type
  45. PSHNOTIFYSTRUCT=^SHNOTIFYSTRUCT;
  46. SHNOTIFYSTRUCT = record
  47. dwItem1 : PItemIDList;
  48. dwItem2 : PItemIDList;
  49. end;
  50.  
  51. Function SHChangeNotifyDeregister(hNotify:integer):integer;stdcall;
  52. external 'Shell32.dll' index 4;
  53.  
  54. Function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMSG,cItems:LongWord;lpps:PIDLSTRUCT):integer;stdcall;
  55. external 'Shell32.dll' index 2;
  56.  
  57. function PathWatch(hWND: Integer ; Path:String=''):Boolean; overload;
  58. function PathWatch(hWND: TWindowHandle; Path:String=''):Boolean; overload;
  59. function PathWatch(var Msg: TMessage; callback: TProc<String,String,String>):Boolean; overload;
  60.  
  61. var
  62. g_HSHNotify : Integer;
  63. g_pidlDesktop : PItemIDList;
  64. g_WatchPath : String;
  65.  
  66. implementation
  67.  
  68. function PathWatch(hWND: Integer; Path:String=''):Boolean;
  69. var
  70. ps:PIDLSTRUCT;
  71. begin
  72. result:=False;
  73. Path:=Path.Replace('/','\');
  74. if(hWnd>=0) then begin // 开始监控
  75. g_WatchPath:=Path.ToUpper;
  76.  
  77. if g_HSHNotify = 0 then begin
  78. SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, g_pidlDesktop);
  79. if Boolean(g_pidlDesktop) then begin
  80. getmem(ps,sizeof(IDLSTRUCT));
  81. ps.bWatchSubFolders := 1;
  82. ps.pidl := g_pidlDesktop;
  83. g_HSHNotify := SHChangeNotifyRegister(hWnd, (SHCNF_TYPE Or SHCNF_IDLIST),(SHCNE_ALLEVENTS Or SHCNE_INTERRUPT),WM_SHNOTIFY, 1, ps);
  84. Result := Boolean(g_HSHNotify);
  85. end else CoTaskMemFree(g_pidlDesktop);
  86. end;
  87. end else begin // 解除监控
  88. if boolean(g_HSHNotify) then if Boolean(SHChangeNotifyDeregister(g_HSHNotify)) then begin
  89. g_HSHNotify := 1;
  90. CoTaskMemFree(g_pidlDesktop);
  91. result := True;
  92. end;
  93. end;
  94. end;
  95.  
  96. function PathWatch(hWND: TWindowHandle; Path:String=''):Boolean;
  97. begin
  98. PathWatch(FmxHandleToHWND(hWND),Path); // FireMonkey的窗体不接受处理Windows消息
  99. end;
  100.  
  101. function PathWatch(var Msg: TMessage; callback:TProc<String,String,String>):Boolean;
  102. var
  103. a, s1,s2 : String;
  104. buf : array[0..MAX_PATH] of char;
  105. pidlItem : PSHNOTIFYSTRUCT;
  106. begin
  107. pidlItem :=PSHNOTIFYSTRUCT(Msg.WParam);
  108. SHGetPathFromIDList(pidlItem.dwItem1, buf); s1 := buf;
  109. SHGetPathFromIDList(pidlItem.dwItem2, buf); s2 := buf;
  110. a:='';
  111. case Msg.LParam of
  112. // SHCNE_RENAMEITEM : a := '重命名' ;
  113. SHCNE_CREATE : a := '建立文件' ;
  114. // SHCNE_DELETE : a := '删除文件' ;
  115. // SHCNE_MKDIR : a := '新建目录' ;
  116. // SHCNE_RMDIR : a := '删除目录' ;
  117. // SHCNE_ATTRIBUTES : a := '改变属性' ;
  118. // SHCNE_MEDIAINSERTED : a := '插入介质' ;
  119. // SHCNE_MEDIAREMOVED : a := '移去介质' ;
  120. // SHCNE_DRIVEREMOVED : a := '移去驱动器' ;
  121. // SHCNE_DRIVEADD : a := '添加驱动器' ;
  122. // SHCNE_NETSHARE : a := '改变共享' ;
  123. // SHCNE_UPDATEDIR : a := '更新目录' ;
  124. // SHCNE_UPDATEITEM : a := '更新文件' ;
  125. // SHCNE_SERVERDISCONNECT: a := '断开连接' ;
  126. // SHCNE_UPDATEIMAGE : a := '更新图标' ;
  127. // SHCNE_DRIVEADDGUI : a := '添加驱动器' ;
  128. // SHCNE_RENAMEFOLDER : a := '重命名文件夹' ;
  129. // SHCNE_FREESPACE : a := '磁盘空间改变' ;
  130. // SHCNE_ASSOCCHANGED : a := '改变文件关联' ;
  131. // else a := '其他操作' ;
  132.  
  133. end;
  134. result := True;
  135. if( (a<>'') and (Assigned(callback)) and (s1.ToUpper.StartsWith(g_WatchPath))) and (not s1.Contains('_plate')) then
  136. begin
  137. callback(a,s1,g_WatchPath);
  138. end;
  139. end;
  140.  
  141. end.

调用:

PathWatch(self.Handle, DM.Config.O['Local'].S['PhotoPath']);

窗体中需要消息事件触发:

procedure MsgListern(var Msg: TMessage); message WM_SHNOTIFY;     // 触发监听事件

  1. procedure TFormMain.MsgListern(var Msg: TMessage);
  2. begin
  3. PathWatch(Msg, Procedure(act,fn,s2: string) begin
  4. if(act='建立文件') then begin
  5. if SecondsBetween(now(), PrePostTime) >= 5 then //两个时间之间相差的秒数
  6. begin
  7. // 这里处理监控到后 要响应的事情
  8. end;
  9. end;
  10. end);
  11. end;

delphi监控文件夹的更多相关文章

  1. Python 的 pyinotify 模块 监控文件夹和文件的变动

    官方参考: https://github.com/seb-m/pyinotify/wiki/Events-types https://github.com/seb-m/pyinotify/wiki/I ...

  2. Delphi遍历文件夹及子文件夹(可查找固定格式文件)

    Delphi遍历文件夹及子文件夹 {-------------------------------------------------------------------------------过程名 ...

  3. Storm监控文件夹变化 统计文件单词数量

    监控指定文件夹,读取文件(新文件动态读取)里的内容,统计单词的数量. FileSpout.java,监控文件夹,读取新文件内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  4. 【.Net 学习系列】-- FileSystemWatcher 监控文件夹新生成文件,并在确认文件没有被其他程序占用后将其移动到指定文件夹

    监控文件夹测试程序: using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...

  5. [转帖]Linux下inotify监控文件夹状态,发生变化后触发rsync同步

    Linux下inotify监控文件夹状态,发生变化后触发rsync同步 https://www.cnblogs.com/fjping0606/p/6114123.html 1.安装工具--inotif ...

  6. 使用FileSystemWatcher监控文件夹及文件

    引言 这一周主要精力集中学习一个同事开发的本地文件搜索项目上,其中客户端添加共享文件时主要是使用FileSystemWatcher 监控文件,并在各种事件发生时向服务器发送消息. 解决方法 FileS ...

  7. Delphi遍历文件夹

    /// <remarks> /// 遍历文件夹 (引用SysUtils单元) /// </remarks> procedure TfrmMusicMenu.SearchInDi ...

  8. DotNetCore跨平台~Quartz热部署的福音~监控文件夹的变化

    在DotNetCore出来之后,同时也使用了quartz进行调度中心的设计,将它做到docker里方便部署,在之前的quartz版本里支持配置文件的方式,而现在不支持了,我们应该去想一下,为什么不去支 ...

  9. Java 学习笔记 观察者模式与适配者模式 监控文件夹

    2019.4.12 适配器模式,如果某个类需要实现多个方法,但是开发过程中只需要实现其中的一两个方法,直接使用该类的适配器类,复写需要实现的方法即可 观察者模式:有多个观察者observe观察一个主体 ...

随机推荐

  1. win7系统清除USBSTOR记录

    方法一 1.Win+R,出现运行窗口,如图所示: 2.在输入框中输入“regedit”,如图所示: 3.进入后,点击编辑-查找,查找输入框中输入“USBSTOR”(为了加快查找速度,可以只选择“项”) ...

  2. php设计模式之单例(多例),注册器,观察者模式

    单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...

  3. java多线程实现礼花绽放的效果,

    总结:主要是那个红点点在上升的过程中要涂黑色,其实它不是一个点,是一个长条,而是被涂成黑色而隐藏了.还有这个睡眠时间,多线程 是你在面板上随便点,会出现随机的颜色圆圈,点哪里,哪里就可以出现圆 imp ...

  4. 谷歌浏览器无法播放QQ空间视频动画的解决方案

    https://qzonestyle.gtimg.cn/qzone/photo/v7/js/module/flashDetector/flash_tutorial.pdf Chrome开启⽅法 1. ...

  5. Oracle 11G的间隔(INTERVAL)分区

    -- Create table create table MS_BIGTABLE_LOG ( record_date DATE, col_1 VARCHAR2(), col_2 VARCHAR2() ...

  6. ubuntu安装nginx踩坑

    ubuntu安装nginx 安装nginx tar -zxvf nginx-1.15.5.tar.gz -C /usr/local/src 解压 cd /usr/local/src/nginx-1.1 ...

  7. 浅析bootstrap原理及优缺点

    网格系统的实现原理,是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统   网格系统的实现原理,是通过定义 ...

  8. CSS a 标签样式

    CSS a 标签样式 a:LINK { color: red; } a:VISITED { color: yellow; } a:HOVER { color: green; } a:ACTIVE { ...

  9. Mac hook—DYLD_INSERT_LIBRARIES

    [Mac hook—DYLD_INSERT_LIBRARIES] 1.gcc生成dylib. gcc -dynamiclib -o mysharedlib.dylib mysharedlib.c 2. ...

  10. 【FZU2280】Magic

    题意 给出n个字符串,每个字符串有一个权值wi 有q个操作,操作有两种 1 x y 将字符串x的权值变为y 2 x 查询操作,输出以字符串x为后缀,且权值小于等于wx的字符串个数.其中n<=10 ...