Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Монитор каталогов+поток+имяфайла [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо