pyscripter 825 Posted Tuesday at 04:47 PM (edited) 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 Tuesday at 09:22 PM by pyscripter 16 11 Share this post Link to post
Tommi Prami 157 Posted yesterday at 03:55 AM (edited) 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 yesterday at 04:23 AM by Tommi Prami typo Share this post Link to post
Dave Novo 57 Posted 15 hours ago Thanks for all the amazing work you do and contribute to the community! Share this post Link to post
mjustin 31 Posted 57 minutes ago Sorry for asking, but is polling still necessary if the monitoring application (which uses IFileSystemMonitor) was not running for a while, and during that time changes happened? Or does IFileSystemMonitor provide ways to detect changes which happened while it was "absent"? Share this post Link to post
M.e.l 1 Posted 21 minutes ago Hi, It looks simple and good. Does it work across network or VPN ? i.e. can a server directory be monitored from an app running your monitoring class on a client PC, connected to the server through network ? Mel Share this post Link to post