Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

ReadDirectoryChagesW на все логичесике диски   Найти похожие ветки 

 
NeoMaster ©   (2005-08-14 13:39) [0]

Можно ли установить слежение за изменениями с помощью ReadDirectoryChangesW на всех логических дисках?


 
Юрий Зотов ©   (2005-08-14 14:58) [1]

Можно поставить свою ловушку для каждого диска (см. GetLogicalDrives (или GetLogicalDriveStrings), GetDriveType, FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification), и в потоке ждать изменений (см. WaitForSingleObject или WaitForMultipleObjects), а когда изменение произошло - анализировать его через ReadDirectoryChangesW.


 
NeoMaster ©   (2005-08-14 19:42) [2]

>Юрий Зотов
Пожалуйста поконктретней напиши о том как ставить Hook на изменение.


 
Игорь Шевченко ©   (2005-08-15 10:16) [3]


> Можно ли установить слежение за изменениями с помощью ReadDirectoryChangesW
> на всех логических дисках?


Можно. По одной ловушке для каждого диска.


 
Rouse_ ©   (2005-08-15 12:32) [4]

> Пожалуйста поконктретней напиши о том как ставить Hook на
> изменение.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, 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;
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
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;
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);
 if Dir <> INVALID_HANDLE_VALUE then
 try
   if not ReadDirectoryChangesW(Dir, @Notify, SizeOf(TFileNotifyInformation),
     False, Filter, @BytesReturned, nil, nil) then
     raise Exception.Create(SysErrorMessage(GetLastError))
   else
     case Notify.Action of
       FILE_ACTION_ADDED: ShowMessage("New file" + Notify.FileName);
       FILE_ACTION_REMOVED: ShowMessage("Delete file" + Notify.FileName);
       FILE_ACTION_MODIFIED: ShowMessage("Modify file" + Notify.FileName);
       FILE_ACTION_RENAMED_OLD_NAME: ShowMessage("Old Name file" + Notify.FileName);
       FILE_ACTION_RENAMED_NEW_NAME: ShowMessage("New Name file" + Notify.FileName);
     end;
 finally
   CloseHandle(Dir);
 end;
end;

end.


 
NeoMaster ©   (2005-08-15 19:19) [5]

Отслеживать изменения на одном диске я умею. А каким образом можно сделать с несколькими дисками сразу.
Пожалуйста попробуйте выше описанный код изменить, чтобы он отслеживал изменения на нескольких дисках. ВОТ ПРОБЛЕМА ТО.


 
Alexander Panov ©   (2005-08-15 19:22) [6]

Продублируй этот код для каждого диска.
ВОТ ПРОБЛЕМА ТО.


 
Fay ©   (2005-08-15 19:25) [7]

2 Alexander Panov ©   (15.08.05 19:22) [6]
>> Продублируй этот код ...
8))


 
NeoMaster ©   (2005-08-15 19:56) [8]

В начале определяешь сколько лог. дисков на компьютере, а затем уже вызываешь этот код.
Вот строчка :  Dir := CreateFile("d:\", GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
А мне нужно установить за всеми дисками, не только за d:\.(точное кол-во дисков не известно)


 
Alexander Panov ©   (2005-08-15 20:02) [9]

см. [6]


 
Fay ©   (2005-08-15 20:06) [10]

2 NeoMaster ©   (15.08.05 19:56) [8]
Прочитай уже ответ [1] Юрия Зотова


 
NeoMaster ©   (2005-08-16 07:47) [11]

Пожалуйста киньте примерчик.


 
NeoMaster ©   (2005-08-16 17:50) [12]

up


 
Fay ©   (2005-08-16 18:12) [13]

2 NeoMaster ©   (16.08.05 7:47) [11]
var
 ld, n : DWORD;
 s : string;
begin
 ld := GetLogicalDrives;
 for n := 0 to 31 do
   if ((ld shr n) and 1) <> 0 then
     begin
       s := Char(Ord("A") + n) + ":\";
       if GetDriveType(PChar(s)) = DRIVE_FIXED then
         ShowMessage(s);
     end;


 
SpyBoy ©   (2005-08-16 18:32) [14]

Нельзя ли объяснить , что может , а чего не может эта ваша ловушка на диск.



Страницы: 1 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.049 c
14-1127220284
Дядя Фёдор
2005-09-20 16:44
2005.10.16
Как сделать чтоб при надатии кнопки содержимое Edit сохранялась в


14-1127454649
nk
2005-09-23 09:50
2005.10.16
Что есть DNS, и где он нужен ?! )


2-1125567964
intel
2005-09-01 13:46
2005.10.16
поиск файлов


1-1127727660
Sergey_R
2005-09-26 13:41
2005.10.16
StringGrid и иконки


3-1125786977
Пантелеев Иван
2005-09-04 02:36
2005.10.16
Проблемы с фильтрацией по дате