помогите....
вот код для отлова изменений в фс
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,wfsU, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
CheckBox7: TCheckBox;
CheckBox8: TCheckBox;
CheckBox9: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
procedure MyInfoCallBack(pInfo: TInfoCallBack);
const
Action: array[1..3] of String = ('Создание: %s', 'Удаление: %s', 'Изменение: %s');
begin
case pInfo.FAction of
FILE_ACTION_RENAMED_NEW_NAME: Form1.Memo1.Lines.Add(Format('Переименование: %s в %s',
[pInfo.FDrive+pInfo.FOldFileName,pInfo.FDrive+pInfo.FNewFileName]));
else
if pInfo.FAction<FILE_ACTION_RENAMED_OLD_NAME then
Form1.Memo1.Lines.Add(Format(Action[pInfo.Faction], [pInfo.FDrive+pInfo.FNewFileName]));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Flags:Cardinal;
begin
Flags:=0;
if CheckBox2.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_FILE_NAME;
if CheckBox3.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_DIR_NAME;
if CheckBox4.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_ATTRIBUTES;
if CheckBox5.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_SIZE;
if CheckBox6.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_LAST_WRITE;
if CheckBox7.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_LAST_ACCESS;
if CheckBox8.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_CREATION;
if CheckBox9.Checked then Flags:=Flags or FILE_NOTIFY_CHANGE_SECURITY;
StartWatch(Edit1.Text, Flags, CheckBox1.Checked, @MyInfoCallBack);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
StopWatch;
end;
end.
вот управляющий юнит
unit wfsU;
interface
type
PInfoCallBack = ^TInfoCallBack;
TInfoCallBack = record
FAction : Integer;
FDrive : string;
FOldFileName : string;
FNewFileName : string;
end;
TWatchFileSystemCallBack = procedure (pInfo: TInfoCallBack);
procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
procedure StopWatch;
implementation
uses
Classes, Windows, SysUtils;
const
FILE_LIST_DIRECTORY = $0001;
type
PFileNotifyInformation = ^TFileNotifyInformation;
TFileNotifyInformation = record
NextEntryOffset : DWORD;
Action : DWORD;
FileNameLength : DWORD;
FileName : array[0..0] of WideChar;
end;
WFSError = class(Exception);
TWFS = class(TThread)
private
FName : string;
FFilter : Cardinal;
FSubTree : boolean;
FInfoCallBack : TWatchFileSystemCallBack;
FWatchHandle : THandle;
FWatchBuf : array[0..4096] of Byte;
FOverLapp : TOverlapped;
FPOverLapp : POverlapped;
FBytesWritte : DWORD;
FCompletionPort : THandle;
FNumBytes : Cardinal;
FOldFileName : string;
function CreateDirHandle(aDir: string): THandle;
procedure WatchEvent;
procedure HandleEvent;
protected
procedure Execute; override;
public
constructor Create(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
destructor Destroy; override;
end;
var
WFS : TWFS;
procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
begin
WFS:=TWFS.Create(pName, pFilter, pSubTree, pInfoCallBack);
end;
procedure StopWatch;
var
Temp : TWFS;
begin
if Assigned(WFS) then
begin
PostQueuedCompletionStatus(WFS.FCompletionPort, 0, 0, nil);
Temp := WFS;
WFS:=nil;
Temp.Terminate;
end;
end;
constructor TWFS.Create(pName: string; pFilter: cardinal;
pSubTree: boolean; pInfoCallBack: TWatchFileSystemCallBack);
begin
inherited Create(True);
FreeOnTerminate:=True;
FName:=IncludeTrailingBackslash(pName);
FFilter:=pFilter;
FSubTree:=pSubTree;
FOldFileName:=EmptyStr;
ZeroMemory(@FOverLapp, SizeOf(TOverLapped));
FPOverLapp:=@FOverLapp;
ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
FInfoCallBack:=pInfoCallBack;
Resume
end;
destructor TWFS.Destroy;
begin
PostQueuedCompletionStatus(FCompletionPort, 0, 0, nil);
CloseHandle(FWatchHandle);
FWatchHandle:=0;
CloseHandle(FCompletionPort);
FCompletionPort:=0;
inherited Destroy;
end;
function TWFS.CreateDirHandle(aDir: string): THandle;
begin
Result:=CreateFile(PChar(aDir), FILE_LIST_DIRECTORY, FILE_SHARE_READ+FILE_SHARE_DELETE+FILE_SHARE_WRITE,
nil,OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);
end;
procedure TWFS.Execute;
begin
FWatchHandle:=CreateDirHandle(FName);
WatchEvent;
end;
procedure TWFS.HandleEvent;
var
FileNotifyInfo : PFileNotifyInformation;
InfoCallBack : TInfoCallBack;
Offset : Longint;
begin
Pointer(FileNotifyInfo) := @FWatchBuf[0];
repeat
Offset:=FileNotifyInfo^.NextEntryOffset;
InfoCallBack.FAction:=FileNotifyInfo^.Action;
InfoCallBack.FDrive:=FName;
SetString(InfoCallBack.FNewFileName,FileNotifyInfo^.FileName,
FileNotifyInfo^.FileNameLength );
InfoCallBack.FNewFileName:=Trim(InfoCallBack.FNewFileName);
case FileNotifyInfo^.Action of
FILE_ACTION_RENAMED_OLD_NAME: FOldFileName:=Trim(WideCharToString(@(FileNotifyInfo^.FileName[0])));
FILE_ACTION_RENAMED_NEW_NAME: InfoCallBack.FOldFileName:=FOldFileName;
end;
FInfoCallBack(InfoCallBack);
PChar(FileNotifyInfo):=PChar(FileNotifyInfo)+Offset;
until (Offset=0) or Terminated;
end;
procedure TWFS.WatchEvent;
var
CompletionKey: Cardinal;
begin
FCompletionPort:=CreateIoCompletionPort(FWatchHandle, 0, Longint(pointer(self)), 0);
ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
if not ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree,
FFilter, @FBytesWritte, @FOverLapp, 0) then
begin
raise WFSError.Create(SysErrorMessage(GetLastError));
Terminate;
end else
begin
while not Terminated do
begin
GetQueuedCompletionStatus(FCompletionPort, FNumBytes, CompletionKey, FPOverLapp, INFINITE);
if CompletionKey<>0 then
begin
Synchronize(HandleEvent);
ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
FBytesWritte:=0;
ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree, FFilter,
@FBytesWritte, @FOverLapp, 0);
end else Terminate;
end
end
end;
end.
вопрос - если добавляю несколько директорий для мониторинга как удалить потом ненужную директорию?