Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.049 c
4-1124088075
Арсений
2005-08-15 10:41
2005.10.16
8 БИТ И ВСЕ, ВСЕ, ВСЕ…


14-1127592077
NikNet
2005-09-25 00:01
2005.10.16
Где взять компонент TCPParser?


14-1127212706
pazitron_brain
2005-09-20 14:38
2005.10.16
шкс,


3-1125652771
Nickolay
2005-09-02 13:19
2005.10.16
Простейшие операции с таблицами БД Access с помощью ADO


1-1127653321
kami
2005-09-25 17:02
2005.10.16
Невозможно установить иконку формы и приложения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский