Watching Directories

delphi package - easy access to shell apis

Watching Directories

Postby Muesli » Mon Dec 12, 2005 6:47 am

Hello,

I am writing a program in Delphi 7, that does jobs, which are defined in template files being located in the applications directory.
Not I wanted to be informed when a new template file in this directory is created. So I found your madShell and it works fine. Thanks for this. :-)


But later, I noticed, that my program will also be notified, when files are created in sub directories although I did not indicated that.

Here is some code:

Code: Select all
  // I have made a new class which handles your madShell

Type
  TChangeType = (ctAll, ctFileCreated, ..., ctDirectoryRenamed);
  TChangeTypes = Set Of TChangeType;

  TDirectoryWatch = Class (TObject)
  Private
    fDirectory: String;
    fSubTree : Boolean;
   ...
    fOnFileCreated  : TFileEvent;
   ...

    procedure ShellEvent(event: TShellEventType; const obj1, obj2: IShellObj; drive: char; value: cardinal);
  Protected
    Procedure Initialize;
    Procedure Finalize;
   ...

    Procedure NotifyFileCreated (FileName: TFileName);
  Public
    Constructor Create (aPath: String; aSubTree: Boolean; aChangeTypes: TChangeTypes = [ctAll]); Overload;

   ...

    Property ChangeTypes: TChangeTypes Read fChangeTypes Write fChangeTypes;

    Property OnFileCreated: TFileEvent Read fOnFileCreated Write fOnFileCreated;
  End;

implementation

Constructor TDirectoryWatch.Create(aPath: String; aSubTree: Boolean; aChangeTypes: TChangeTypes);
Begin
  Inherited Create ();
  fDirectory := IncludeTrailingPathDelimiter (aPath);
  fChangeTypes := aChangeTypes;
  fSubTree := aSubTree;
  Initialize;
End;

procedure TDirectoryWatch.Finalize;
begin
  UnregisterShellEvent (ShellEvent);
end;

procedure TDirectoryWatch.Initialize;
begin
  RegisterShellEvent (ShellEvent, fDirectory, fSubTree);
end;

procedure TDirectoryWatch.NotifyFileCreated(FileName: TFileName);
begin
  If ((ctFileCreated In ChangeTypes) Or (ctAll In ChangeTypes)) Then
    If Assigned (fOnFileCreated) Then 
      fOnFileCreated (Self, FileName);
end;

procedure TDirectoryWatch.ShellEvent(event: TShellEventType; const obj1,
  obj2: IShellObj; drive: char; value: cardinal);
begin
  Case event Of
    seItemCreated: NotifyFileCreated (obj1.Path);
   ...
  End;
end;




In my program i create an instance of this class as follows:

Code: Select all
  // Path is the applications directory:
  // Path := ExtractFilePath (Application.ExeName);
  fDirectoryWatch:= TDirectoryWatch.Create (Path, False);


So the method to register the ShellEvent is called like this:

Code: Select all
  // fDirectory = 'D:\Sandbox\NavImport\Bin\'
  // fSUbTree = False
  RegisterShellEvent (ShellEvent, fDirectory, fSubTree);



Now being notified I can check whether the filepath is the same as the directories path, but I just want to ask, whether I made a mistake, or whether there is a bug in your madShell.

Greetings,
Muesli
Muesli
 
Posts: 3
Joined: Mon Dec 12, 2005 6:04 am

Postby madshi » Mon Dec 12, 2005 11:02 am

Which OS are we talking about?
madshi
Site Admin
 
Posts: 9268
Joined: Sun Mar 21, 2004 5:25 pm

Postby Muesli » Mon Dec 12, 2005 1:20 pm

the program runs on windows 2000...
Muesli
 
Posts: 3
Joined: Mon Dec 12, 2005 6:04 am

Postby madshi » Thu Jan 05, 2006 10:22 am

Sorry for the long delay. I've fixed this now. A new build will be availably soon.
madshi
Site Admin
 
Posts: 9268
Joined: Sun Mar 21, 2004 5:25 pm


Return to madShell

Who is online

Users browsing this forum: No registered users and 1 guest