Jump to content
pyscripter

New file system monitoring component

Recommended Posts

Whilst there are many Delphi components for detecting changes to file system folders they suffer from serious limitations:

  • typically they only allow you to monitor a single folder
  • they do not support the monitoring of specific files
  • they rely on the FindFirstChangeNotification API which gives no information about what has changed, requiring an inefficient search.

 

I have created a new file system monitoring library that addresses the above limitations.

 

Features:

  • Easy to use, but also suitable for heavy duty monitoring
  • Single unit with no external dependencies
  • Allows monitoring folders and/or specific files
  • Uses the ReadDirectoryChangesW API which provides information about what exactly was changed
  • A single instance of the component can handle the monitoring of many folders and/or files
  • Uses an I/O completion port for efficient handling of large numbers of requests
  • A single thread handles all requests
  • A different notification handler can be specified for each request
  • You can have multiple handlers for each folder or file

  • When you monitor folders you can specify whether you want to also monitor subfolders

 

Installation:

You do not need to install the library. Just download or clone the repo and add the source subdirectory to the Library path.

 

Usage:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Create the IFileSystemMonitor interface
  FFileSystemMonitor := CreateFileSystemMonitor;
  // Monitor a directory
  FFileSystemMonitor.AddDirectory(TPath.GetTempPath, False, HandleChange);
  // Also monitor a specific file
  FFileSystemMonitor.AddFile('pathtoyourfile',  HandleChange);
end;

procedure TForm1.HandleChange(Sender: TObject; const Path: string;
  ChangeType: TFileChangeType);
begin
  with lvEventList.Items.Add do
  begin
    Caption := GetEnumName(TypeInfo(TFileChangeType), Integer(ChangeType));
    SubItems.Add(Path);
  end;
end;

To stop monitoring a specific file or folder you use the following methods:

    function RemoveDirectory(const Directory: string; OnChange: TMonitorChangeHandler): Boolean;
    function RemoveFile(const FilePath: string; OnChange: TMonitorChangeHandler): Boolean;

 

Edited by pyscripter
  • Like 12
  • Thanks 4

Share this post


Link to post

Very nice.  Way better than constant polling for sure.

I think I have no use for this now, but have to think about it, maybe I can think of something.

In previous live used FindFirstChangeNotification  API, did not knoew that there is other API for this.

-Tee-

Edited by Tommi Prami
typo

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×