views:

387

answers:

3

Hi there,

I need to writing a delphi program which will monitor a folder for changes (Add, update, rename and removal of files). Is the TShellChangeNotifier is way to go? To be honest, I have no idea how to use it.

Please help.

Thanks.

+5  A: 

I think this article will help you: Monitoring System Shell Changes using Delphi

Basically it analyzes the TShellChangeNotifier, discards it and then goes for a TSHChangeNotify which is basically a wrapper for the SHChangeNotify windows api function.

Jorge Córdoba
It seem to be monitor the entire file system, I can only limit it to monitor local hard drives. Is there a way where I could specify the folder it will only monitor? I am worry it might eat up a lot of unnecessary resources. Thanks a lot.
Snackmoore
I don't think you can, at least with the SHChangeNotify. Nonetheless is shouldn't eat up a lot of resources, you'll just ignore whatever doesn't affects the path you're interested in, windows will monitor all the changes wheter you're listening or not :)
Jorge Córdoba
+5  A: 

This question might help. mghie's answer shows how to properly use ReadDirectoryChangesW.

Smasher
A: 

i suggest using madShell

RegisterShellEvent(ShellEvent, pathToMonitor, false, [seItemCreated, seItemRenamed]);

//

procedure Tform.ShellEvent(event: TShellEventType; const obj1, obj2: IShellObj; drive: char; value: cardinal);
var
  filename: string;
  isReady: boolean;
begin
  if (event = seItemCreated) then
    filename := obj1.Path
  else if (event = seItemRenamed) then
    filename := obj2.Path
  else
    exit;

  // try to open to ensure it's read for reading
  repeat
    try
      TfileStream.Create(filename, fmOpenRead + fmShareExclusive).Free;
      isReady := true;
    except
      isReady := false;
      sleep(250);
    end;
  until (isReady) or (not FileExists(filename));

  OutputDebugString(pChar('ShellEvent: ' + filename));

end;
glob
I don't know madShell but that `repeat` loop looks very ugly. It continually throws and catches exceptions and has a hard-coded delay...not what I expect from a clean and efficient solution...
Smasher