Главная страница
    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.48 MB
Время: 0.037 c
11-1108458489
NorthMan
2005-02-15 12:08
2005.10.16
Почему KOL ругается на Classes.pas?


14-1127807545
Андрей Жук
2005-09-27 11:52
2005.10.16
Delphi. Готовые алгоритмы


3-1125631152
DrAndrey
2005-09-02 07:19
2005.10.16
GETDATE() внутри User Defined Functions


2-1126757466
Vardoulacha
2005-09-15 08:11
2005.10.16
Как обратится к свойствам компонента???


9-1116326699
VVV-First
2005-05-17 14:44
2005.10.16
GlScene, Objects





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский