实时的监控一个目录

在WIN32下用DELPHI侦测目录变化,可用WIN32提供的文件改变通知API来完成。FindFirstChangeNotification, FindNextChangeNotification,FindCloseChangeNotification。
在应用程序中调用这些函数时,产生一个监控这个变化的句柄,可用WAIT函数集来等待这个变化。这样,当监控程序运行时,可以达到监控文件变化的动作。更进一步,可把此程序做成一个状态区图标(TRAY)来完成监控。
Windows在删除、复制、移动、访问文件时并不发送消息,当然截获不到。要截取这些操作过程的唯一办法就是截获API,这又需要你编写Vxd程序了,杀毒软件都是这样作的。你注意一下杀毒软件一般都带有一个vxd程序。光有vxd还不行,还需截获文件API。还有另外一个办法,就是CIH病毒采用的办法,直接跳到系统零层去操作。具体办法如下:
一、SIDT指令( 将中断描述符表寄存器IDTR--64位宽,16~47Bit存有中断描述符表IDT基地址--的内容存入指定地址单元)不是特权指令,就是说我们可以在Ring3下执行该指令,获得IDT的基地址,从而修改IDT,增加一个中断门安置我们的中断服务,一旦Ring3程序中产生此中断,VMM就会调用此中断服务程序,而此中断服务程序就运行在Ring0下了。这一点与在DOS下非常相似。
二、要实现对系统中所有文件I/O操作的实时监视,还要用到另一种关键技-FileHooking,通过挂接一个处理函数,截获所有与文件I/O操作有关的系 统调用。Windows9x使用32位保护模式可安装文件系统(IFS),由可安装文件系统管理器(IFSManager)协调对文件系统和设备的访问,它接收以Win32API函数调用形式向系统发出的文件I/O请求,再将请求转给文件系统驱动程序FSD,由它调用低级别的IOS系统实现最终访问。每个文件I/OAPI调用都有一个特定的FSD函数与之对应,IFSManager负责完成由API到FSD的参数装配工作,在完成文件I/OAPI函数参数的装配之后转相应FSD执行之前,它会调用一个称为FileSystemApiHookFunction的Hooker函数。通过安装自己的Hooker函数,就可以截获系统内所有对文件I/O的API调用,从而实现实时监控。
=========================================

procedure TForm1.Button2Click(Sender: TObject);
begin
  {establish a notification for file name changes on the selected directory}
  NotificationHandle := FindFirstChangeNotification(PChar(DirectoryListBox1.Directory), FALSE,FILE_NOTIFY_CHANGE_FILE_NAME);
  {if the notification was set up correctly, modify some UI elements...}
  if (NotificationHandle <> INVALID_HANDLE_VALUE) then
  begin
    Button1.Enabled := TRUE;
    Button2.Enabled := FALSE;
  end
  else
  begin
    {...otherwise indicate that there was an error}
    ShowMessage('There was an error setting the notification');
    Exit;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  dwResult: DWORD;         // holds the result of waiting on the notification
  Waiting: Boolean;        // loop control variable
begin
  {setup the loop control for a continuous loop}
  Waiting := TRUE;
  {indicate that the application is waiting for the change notification to fire}
  Button1.Enabled := FALSE;
  StatusBar1.SimpleText := 'Now waiting for a filename change';
  Application.ProcessMessages;
  {enter the loop}
  while Waiting do
  begin
    {at this point, the application is suspended until the notification
     object is signaled that a filename change has occured in the
     selected directory (this includes file deletions)}
    dwResult := WaitForSingleObject(NotificationHandle,INFINITE);
    if (dwResult = WAIT_OBJECT_0) then
    begin
      {indicate that the notification object was signaled}
      ShowMessage('The selected directory signaled a filename change');
      {query the user to see if they wish to continue monitoring this
       directory}
      if Application.MessageBox('Do you wish to continue monitoring this directory?', 'Continue?', MB_ICONQUESTION or
                                MB_YESNO) = IDYES then
        {if the user wishes to continue monitoring the directory, reset
         the notification object and continue the loop...}
        FindNextChangeNotification(NotificationHandle)
      else
        {...otherwise break out of the loop}
        Waiting := FALSE;
    end;
  end;
  {close the notification object}
  FindCloseChangeNotification(NotificationHandle);
  {reset UI elements}
  Button1.Enabled := FALSE;
  Button2.Enabled := TRUE;
  StatusBar1.SimpleText := '';
  FileListBox1.Update;
end;

===========================================
下面是一个监视的控件:

unit dirnotify;
interface
uses
  Windows, Messages, SysUtils, Classes,
  Graphics, Controls, Forms, Dialogs;
type
  EDirNotificationError = class(Exception);
  TDirNotify = class;
  TNotifyFilter = (nfFileName, nfDirName, nfAttributes, nfSize, nfLastWrite,
    nfSecurity);
  TNotifyFilters = set of TNotifyFilter;
  TNotificationThread = class(TThread)
    Owner: TDirNotify;
    procedure Execute; override;
    procedure DoChange;
  end;
  TDirNotify = class(TComponent)
  private
    FEnabled: Boolean;
    FOnChange: TNotifyEvent;
    FNotificationThread: TNotificationThread;
    FPath: String;
    FWatchSubTree: Boolean;
    FFilter: TNotifyFilters;
    procedure SetEnabled( Value: Boolean );
    procedure SetOnChange( Value: TNotifyEvent );
    procedure SetPath( Value: String );
    procedure SetWatchSubTree( Value: Boolean );
    procedure SetFilter( Value: TNotifyFilters );
    procedure RecreateThread;
  protected
    procedure Change;
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Enabled: Boolean read FEnabled write SetEnabled default True;
    property OnChange: TNotifyEvent read FOnChange write SetOnChange;
    property Path: String read FPath write SetPath;
    property WatchSubTree: Boolean read FWatchSubTree write SetWatchSubTree;
    property Filter: TNotifyFilters read FFilter write SetFilter default [nfFileName, nfDirName, nfAttributes, nfLastWrite, nfSecurity];
  end;
procedure Register;
implementation
const
  LASTERRORTEXTLENGTH = 500;
var
  LastErrorText: array [0..LASTERRORTEXTLENGTH] of char;
function GetLastErrorText: PChar;
begin
  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,
    nil, GetLastError, 0, LastErrorText, LASTERRORTEXTLENGTH, nil );
  Result := LastErrorText;
end;
procedure TNotificationThread.Execute;
var
  h: THandle;
  nf: Longint;
  wst: LongBool;
begin
  nf := 0;
  if (nfFileName in Owner.Filter) then nf := FILE_NOTIFY_CHANGE_FILE_NAME;
  if (nfDirName in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_DIR_NAME;
  if (nfAttributes in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_ATTRIBUTES;
  if (nfSize in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_SIZE;
  if (nfLastWrite in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_LAST_WRITE;
  if (nfSecurity in Owner.Filter) then nf := nf or FILE_NOTIFY_CHANGE_SECURITY;
  // yeahh, this one is stupid but Win98 malfunctions in any other value than 0 or 1
  if Owner.FWatchSubTree then wst := Longbool(1)
  else wst := Longbool(0);
  h := FindFirstChangeNotification( Pointer(Owner.Path), wst, nf );
  if (h = INVALID_HANDLE_VALUE) then
    raise EDirNotificationError.Create( GetLastErrorText );
  repeat
    if (WaitForSingleObject( h, 1000 ) = WAIT_OBJECT_0) then
    begin
      Synchronize(DoChange);
      if not FindNextChangeNotification( h ) then
        raise EDirNotificationError.Create( GetLastErrorText );
    end;
  until Terminated;
end;
procedure TNotificationThread.DoChange;
begin
   Owner.Change;
end;
constructor TDirNotify.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEnabled := True;
  FFilter := [nfFileName];
end;
destructor TDirNotify.Destroy;
begin
  FNotificationThread.Free;
  inherited Destroy;
end;
procedure TDirNotify.Loaded;
begin
  inherited;
  RecreateThread;
end;
procedure TDirNotify.SetEnabled(Value: Boolean);
begin
  if Value <> FEnabled then
  begin
    FEnabled := Value;
    RecreateThread;
  end;
end;
procedure TDirNotify.SetPath( Value: String );
begin
  if Value <> FPath then
  begin
    FPath := Value;
    RecreateThread;
  end;
end;
procedure TDirNotify.SetWatchSubTree( Value: Boolean );
begin
  if Value <> FWatchSubTree then
  begin
    FWatchSubTree := Value;
    RecreateThread;
  end;
end;
procedure TDirNotify.SetFilter( Value: TNotifyFilters );
begin
  if Value <> FFilter then
  begin
    FFilter := Value;
    RecreateThread;
  end;
end;
procedure TDirNotify.SetOnChange(Value: TNotifyEvent);
begin
   FOnChange := Value;
end;
procedure TDirNotify.Change;
begin
   if Assigned(FOnChange) then FOnChange(Self);
end;
procedure TDirNotify.RecreateThread;
begin
  // destroy thread
  FNotificationThread.Free;
  FNotificationThread := nil;
  if FEnabled and not(csDesigning in ComponentState)
    and not(csLoading in ComponentState) and (FPath <> '') then
  begin
    // create thread
    FNotificationThread := TNotificationThread.Create(True);
    FNotificationThread.Owner := self;
    FNotificationThread.Resume;
  end;
end;
procedure Register;
begin
   RegisterComponents('System', [TDirNotify]);
end;
end. 

转载于:https://www.cnblogs.com/railgunman/archive/2010/12/08/1900702.html

Golang 通过fsnotify监控多级目录文件 Golang 通过fsnotify监控文件,检测文件夹目录层级文件夹变化,菜鸟一枚,欢迎赐教! 1. 调用fsnotify包监控文件: FSNotify.go package FSNotify import ( "fmt" "github.com/fsnotify/fsnotify" "os" "path/filepath" ) type NotifyFile struct ... 阅读详情

相关推荐

inotifywait实现目录监控

传统的rsync+crontab同步数据和实际会有差异,而inotify则基本可以达到实时的效果,当文件有任何变动,就会触发inotify。 inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除、读、写和卸载操作等。inotify安装完成之后会有两个命令, inotifywait 和 inotifywatch。inotifywait

firefoxbug的专栏 1万+

Delphi TNotifyEvent是Delphi中基本通知事件的类型

TNotifyEvent是Delphi中基本通知事件的类型,定义为:      type          TNotifyEvent   =   procedure(Sender:   TObject)   of   object;      它除了发送者外不带任何其他信息,只用作通知程序某个事件已经发生的用途。   可以自己定义许多类似的类型,用来处理事件;           

alongwilliam的专栏 2448

delphi 实现文件夹内容监控

delphi 实现,可以配置监控文件夹,对与文件夹下的文件变更都会记录日志,包括新建、删除、修改内容都会记录日志。

Delphi 实时的监控一个目录

http://hi.baidu.com/t810509/item/ac0b0a978f6c984df1421582 在WIN32下用DELPHI侦测目录变化,可用WIN32提供的文件改变通知API来完成。FindFirstChangeNotification, FindNextChangeNotification,FindCloseChangeNotification。 在应用程序中调用这些函

l799623787的专栏 1910

delphi监控文件夹文件控件

delphi监控文件夹文件控件,测试通过。 delphi监控文件夹文件控件,测试通过。

SAP 财务BAPI_ACC_DOCUMENT_POST批导的税务tax

最近遇到了关于SAP财务凭证批导要bapi:BAPI_ACC_DOCUMENT_POST增加税的功能要求,查阅了一众文献发现都不尽如人意,所以想着自己写一个趟过的雷吧。 一般前台sap的凭证是有自动计算税码的勾选框的,但是bapi却并没有这个字段。 实际操作过程中1.可以定义一个税额的结构,参考bapiactx09 2.在会计分录上传如果需要增加税码的时候,譬如总账gl,需要对应tax_code 3.通过CALCULATE_TAX_FROM_GROSSAMOUNT 计算出税额和acct_k...

qq_35640448的博客 3185

【Flume中间件】(4)实时监控一个文件目录下的多个文件

实时监控一个文件目录下的多个文件 有时我们不需要监控一个文件的追加数据,而是进行检测一个文件目录下是否有新的文件,这是就可以采用spool源进行替代exec那种方式,其实用exec也可以,将命令换一下,但是可能效率较低,因为是一行一行的读取嘛。 采用spool源就可以指定文件目录进行监控,它的作用机制是当我们向该文件夹中传输文件时,flume会将该文件传到sink,然后flume会将传进来的数据加个后缀,用来区别该文件是否上传过,所以当我们把一个文件传输进来后,再次进行更改该文件,flume不会监听的到,因

优快云 精品推荐 855

从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型2

上一期分析了MATLAB的黄金算法原理,这一期进行Simulink模块分析。

WZT725的博客 2086

监控一个目录,如果有新文件就启动一个线程复制到另一个目录

要求: 实时监控一个目录,如果目录里有新增文件就启动一个复制文件线程进行文件复制,把文件复制到另一个目录里。 实时监控程序: package cn.ba.watchFile.downLoadFile.finalcode; /** * 监控文件夹 * 经测试基本不可用,在一个40g的很深的目录下去新建和删除文件5分钟都没结果,主要原因是需要对每一个Path进行注册监控。 ...

weixin_30596343的博客 316

matlab生成blocks、bumps和doppler标准测试信号

关键函数:wnoise使用方式X = wnoise(FUN,N) [X,XN] = wnoise(FUN,N,SQRT_SNR) [X,XN] = wnoise(FUN,N,SQRT_SNR,INIT)X = wnoise(FUN,N) 返回由 FUN给出的信号,长度为2^N,幅值范围[0,1].[X,XN] = wnoise(FUN,N,SQRT_SNR) ,返回了一个测试信号X,以及一个加噪

ZSZ_shsf的博客 6580

微调BERT进行中文文本分类任务(Pytorch代码实现)

BERT(Bidirectional Encoder Representation from Transformers)是2018年10月由Google AI研究院提出的一种预训练模型。其模型结构由多层Transformer的Encoder堆叠而成,在大规模语料中进行预训练后,迁移到下游任务,仅进行参数微调训练,就能显著提升性能。本文聚焦于微调中文BERT进行新闻标题分类任务的代码实现。

Iswayzw的博客 1万+

python监控文件/目录变化

python监控文件/目录变化的库有许多,试了一些,个人感觉watchdog挺好用,对文件的创建/修改/删除等都可以监控到,而且跨平台,用法也比较简单。 代码示例 import time from watchdog.events import * from watchdog.observers import Observer class FileEventHandler(FileSystem...

浅醉樱花雨的专栏 6709

SAP ABAP CO核心扩展-ZCKMLQS 多物料工厂的评估数量结构报表(CKMLQS)

CKMLQS 只能查看单一物料工厂的评估数量结构,SAP 没有提供多物料工厂的评估数量结构报表。这篇文章将实现 CO核心扩展-ZCKMLQS 多物料工厂的评估数量结构报表。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 1089

C#实现实时监控文件目录下的变化

本文主要描述如何通过C#实现实时监控文件目录下的变化,包括文件和目录的添加,删除,修改和重命名等操作。   首先,我们需要对.net提供的FileSystemWatcher类有所了解。我有些懒,找了MSDN对该类的描述。   FileSystemWatcher类侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。   使用 FileSystemWatcher 监视指定

飞龙在天 1万+

Cesium 相机操作

Cesium 提供了三种方式对相机的位置进行摆放。

虎康的博客 2588

开源3D激光SLAM算法的异同点、优劣势与适配场景总结

本文对比分析了主流开源3D激光SLAM方案的核心差异与适用场景。LOAM架构简洁但精度较低;LeGO-LOAM轻量化适合地面机器人;LIO-SAM采用因子图优化支持多传感器融合;LVI-SAM通过视觉-激光-惯性三重冗余提升鲁棒性;FAST-LIO系列基于滤波架构实现超高实时性。选型需权衡传感器配置(纯激光/激光+IMU/激光+视觉)、运动状态(高速/常规)、计算资源等因素:资源受限选LeGO-LOAM或Faster-LIO,高速运动选FAST-LIO系列,退化环境选LVI-SAM,全局一致性需求选LIO-

Studying…… 651

java 线程实时监控硬盘文件目录的文件操作状态

1、java 线程实时监控硬盘文件目录的文件操作状态。 package test; import java.io.File; public class FileListener { public static void main(String[] args) { String path = "e:/test"; Thread listener

夕慕慕的博客 1386

OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南

OpenClaw已经开源3个月有余,作为深耕AI Agent领域的博主,我亲身探索了各种基于OpenClaw的赚钱方法,也踩过坑、付出了时间与精力。现在,我将这些真金白银砸出来的实战经验,毫无保留地总结成这个专栏,分享给不想从零开始摸索的你。博主在优快云已有7万+粉丝和1100万+阅读量,但这却是我的第一个付费专栏。正因如此,我比任何人都更珍惜这个“第一次”。我会像一个手艺人打磨作品一样,死磕每一篇文章的质量,并持续根据订阅者的反馈优化内容。也许你的疑问就是当篇文章的优化点。

冯·诺依曼 2439

oracle sql实时监控工具_Linux系统上实时监控文件和目录的变化工具之Pyinotify

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言本文主要介绍Pyinotify这个文件系统监控工具是如何安装和使用的。在Linux中使用Pyinotify实时监控文件系统的变化Pyinotify是一个简单但有用的Python工具,用于实时监控Linux文件系统变化。作为一名Linux系统管理员,可以使用它跟踪目标目录(如web...

weixin_39930748的博客 106

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

监控目录下生成的文件并上传到ftp

ftpUpload.py #coding:utf8 #author:lcamry import os import sys import pyinotify from ftplib import FTP WATCH_PATH = './' #监控目录 def ftp_connect(host, username, password): ftp = FTP() # ftp...

superbfly的专栏 1288

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

nodejs监控目录

var fs = require('fs'); var events = require('events'); var util = require('util'); function Watcher(watcherDir, processedDir) { this.watcherDir = watcherDir; this.processedDir = processedDir

Keep It Simple, Stupid 1108

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

inotifywait监听php,inotifywait 是一个可以实时监控文件变动的工具

inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能。查看内核版本[root@Oracle ~]# uname -r 2.6.32-220.el6.i686安装inotify-tools yum install -y inotify-tools 测试监控/etc,inotifywait -m /etc 或监控文件 inotifywait ...

weixin_39732534的博客 275

inotifywait 是一个可以实时监控文件变动的工具

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34007886的博客 569

python实时监控文件夹_python 监控文件目录变化

使用os.listdir()监控文件目录:#!/usr/bin/env python#-*- coding=utf-8 -*-#filename: monitor_dir.pyimport osimport timemonitor_dir = "/opt/"now_file = dict([(f,None)for f in os.listdir(monitor_dir)])while True:...

weixin_39649490的博客 322

使用java监控一个目录下文件的变动

直接上代码: import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; import java.nio.file.FileSystems; import java.nio.

beeworkshop的博客 382
上一篇: 映射文件的使用
下一篇: SqlServer存储过程函数加解密[极有用]
aowo7144
博客等级 码龄10年 5粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值