![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Монитор каталогов+поток+имяфайла [D7, XP]
kukuikar © (2007-10-02 11:14:00)Добрый день всем.
С сайта http://delphiworld.narod.ru/взял приложение монитор каталогов. Исходники здесь http://perepetsky.ru/mondir.zip
Приложение мониторит в потоке все изменения в заданном каталоге и при изменениях рапортует об этом. Только не говорит какой файл или каталог изменился. Помогите пожалуйста. Только это... Заранее спасибо всем за помощь...
clickmaker (2007-10-02 13:12:00) [1]const
BUFFER_SIZE = 2048;
var
pNotify: PFileNotifyInformation;
pNotify:= AllocMem(BUFFER_SIZE);
Win32Check(ReadDirectoryChangesW(Dir, pNotify, BUFFER_SIZE, True, Filter, @BytesReturned, nil, nil));
Сергей М. (2007-10-02 12:55:00) [2]
> Application.ProcessMessages;
Этоубирай нафих.
К чему вообще тут таймер ?
Задействуй асинхронныйрежим работы ReadDirectoryChangesW.
После обработки события изменения тут же вновь вызывай ReadDirectoryChangesW.
kukuikar (2007-10-02 12:54:00) [3]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
PFileNotifyInformation = ^TFileNotifyInformation;
TFileNotifyInformation = packedrecord
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: array[0..0] of WideChar;
end;
.................
const
Filter = FILE_NOTIFY_CHANGE_FILE_NAME or
FILE_NOTIFY_CHANGE_DIR_NAME or
FILE_NOTIFY_CHANGE_ATTRIBUTES or
FILE_NOTIFY_CHANGE_SIZE or
FILE_NOTIFY_CHANGE_LAST_WRITE or
FILE_NOTIFY_CHANGE_LAST_ACCESS or
FILE_NOTIFY_CHANGE_CREATION or
FILE_NOTIFY_CHANGE_SECURITY;
var
Dir: THandle;
Notify: TFileNotifyInformation;
BytesReturned: DWORD;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ReadDirectoryChangesW(Dir, @Notify, SizeOf(TFileNotifyInformation), True, Filter, @BytesReturned, nil, nil);
if not ReadDirectoryChangesW(Dir, @Notify, SizeOf(TFileNotifyInformation), True, Filter, @BytesReturned, nil, nil) then
raise Exception.Create(SysErrorMessage(GetLastError))
else
case Notify.Action of
FILE_ACTION_ADDED: Memo1.Lines.Add('Íîâûé' + Notify.FileName);
FILE_ACTION_REMOVED: Memo1.Lines.Add('Óäàëåííûé' + Notify.FileName);
FILE_ACTION_MODIFIED: Memo1.Lines.Add('Èçìåíåííûé' + Notify.FileName);
FILE_ACTION_RENAMED_OLD_NAME: Memo1.Lines.Add('Ñòàðîå èìÿ' + Notify.FileName);
FILE_ACTION_RENAMED_NEW_NAME: Memo1.Lines.Add('Íîâîå èìÿ' + Notify.FileName);
end;
Application.ProcessMessages;
end;
..........
end.
Без изменений, все по старому.
clickmaker (2007-10-02 12:38:00) [4]TFileNotifyInformation = packedrecord
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: array[0..0] of WideChar;
end;
и неплохо бы
Win32Check(ReadDirectoryChangesW
kukuikar (2007-10-02 12:31:00) [5]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
PFileNotifyInformation = ^TFileNotifyInformation;
TFileNotifyInformation = record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: array [0..MAX_PATH - 1] of WideChar;
end;
TForm1 = class(TForm)
Memo1: TMemo;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
Filter = FILE_NOTIFY_CHANGE_FILE_NAME or
FILE_NOTIFY_CHANGE_DIR_NAME or
FILE_NOTIFY_CHANGE_ATTRIBUTES or
FILE_NOTIFY_CHANGE_SIZE or
FILE_NOTIFY_CHANGE_LAST_WRITE or
FILE_NOTIFY_CHANGE_LAST_ACCESS or
FILE_NOTIFY_CHANGE_CREATION or
FILE_NOTIFY_CHANGE_SECURITY;
var
Dir: THandle;
Notify: TFileNotifyInformation;
BytesReturned: DWORD;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ReadDirectoryChangesW(Dir, @Notify, SizeOf(TFileNotifyInformation), True, Filter, @BytesReturned, nil, nil);
case Notify.Action of
FILE_ACTION_ADDED: Memo1.Lines.Add('Новый' + Notify.FileName);
FILE_ACTION_REMOVED: Memo1.Lines.Add('DУдаленный' + Notify.FileName);
FILE_ACTION_MODIFIED: Memo1.Lines.Add('Измененный' + Notify.FileName);
FILE_ACTION_RENAMED_OLD_NAME: Memo1.Lines.Add('Старое имя' + Notify.FileName);
FILE_ACTION_RENAMED_NEW_NAME: Memo1.Lines.Add('Новое имя' + Notify.FileName);
end;
Application.ProcessMessages;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Dir := CreateFile('D:\', GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
end;
end.
Перестает подавать признаки жизни.... Голову сломал...
Anatoly Podgoretsky (2007-10-02 12:02:00) [6]> kukuikar (02.10.2007 11:14:00) [0]
Ты должен сам сравнивать старое состояние с новым
clickmaker (2007-10-02 11:16:00) [7]ReadDirectoryChangesW
FILE_NOTIFY_INFORMATION.FileName