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

Вниз

Может у кого есть пример как использовать ReadDirectoryChangesW?   Найти похожие ветки 

 
Delphi5.01 ©   (2004-10-07 14:25) [0]

Мне кажется из топика все ясно.
Большое спасибо


 
Игорь Шевченко ©   (2004-10-07 14:27) [1]

unit FolderMonitorThread;

interface
uses
 Windows, Classes;

type
 TOnNewFileEvent = procedure (const FileName: string) of object;
 TOnErrorEvent = procedure (const ErrMsg: string) of object;

 TMonitorThread = class(TThread)
 private
   FEventsToWait: array[0..1] of THandle;
   FDirectoryHandle: THandle;
   FOverlapped: OVERLAPPED;
   FBuffer: PChar;
   FOnNewFile: TOnNewFileEvent;
   FOnError: TOnErrorEvent;
 protected
   procedure Execute; override;
   procedure DoOnNewFile (const FileName: string); dynamic;
   procedure DoOnError (const ErrMsg: string); dynamic;
 public
   constructor Create (AStopEvent, ADirectoryHandle: THandle);
   destructor Destroy; override;
   property OnNewFile: TOnNewFileEvent read FOnNewFile write FOnNewFile;
   property OnError: TOnErrorEvent read FOnError write FOnError;
 end;

implementation
uses
 SysUtils, FolderMonitorConsts, CommonConsts;

const
 FOLDER_MONITOR_BUFFER_SIZE = 65530;

procedure ParseNotificationBuffer (Buffer: PChar; AFiles: TStrings);
var
 PEntry: PFILE_NOTIFY_INFORMATION;
 MoreEntries: Boolean;
begin
 AFiles.Clear;
 PEntry := PFILE_NOTIFY_INFORMATION(Buffer);
 MoreEntries := true;
 while MoreEntries do begin
   if PEntry^.NextEntryOffset = 0 then
     MoreEntries := false;
   if PEntry^.Action = FILE_ACTION_ADDED then
     AFiles.Add(WideCharLenToString(PEntry^.FileName,
       PEntry^.FileNameLength div SizeOf(WideChar)));
   PEntry := PFILE_NOTIFY_INFORMATION(PChar(PEntry) + PEntry^.NextEntryOffset);
 end;
end;
 
{ TMonitorThread }

constructor TMonitorThread.Create(AStopEvent, ADirectoryHandle: THandle);
begin
 inherited Create(true);
 FEventsToWait[0] := AStopEvent;
 FEventsToWait[1] := CreateEvent(nil, true, false, nil);
 FOverlapped.hEvent := FEventsToWait[1];
 FDirectoryHandle := ADirectoryHandle;
 FBuffer := AllocMem(FOLDER_MONITOR_BUFFER_SIZE);
 if not Assigned(FBuffer) then
   SetEvent(AStopEvent);
end;

destructor TMonitorThread.Destroy;
begin
 CloseHandle(FEventsToWait[1]);
 if Assigned(FBuffer) then begin
   FreeMem (FBuffer);
   FBuffer := nil;
 end;
 inherited;
end;

procedure TMonitorThread.DoOnError(const ErrMsg: string);
begin
 if Assigned(FOnError) then
   FOnError(ErrMsg);
end;

procedure TMonitorThread.DoOnNewFile (const FileName: string);
begin
 if Assigned(FOnNewFile) then
   FOnNewFile(FileName);
end;

procedure TMonitorThread.Execute;
var
 BytesRead: DWORD;
 WaitResult: DWORD;
 Files: TStringList;
 I: Integer;
begin
 //Не убили ли нас еще при рождении ?
 if WaitForSingleObject(FEventsToWait[0], 1) <> WAIT_TIMEOUT then
   Exit;
 while not Terminated do begin
   if not ReadDirectoryChangesW (FDirectoryHandle, FBuffer,
       FOLDER_MONITOR_BUFFER_SIZE, false, FILE_NOTIFY_CHANGE_FILE_NAME,
       @BytesRead, @FOverlapped, nil) then begin
     DoOnError(SysErrorMessage(GetLastError));
     Terminate;
     Break; //Невозможно поставить запрос наблюдения каталога в очередь
   end;
   WaitResult := WaitForMultipleObjects(2, @FEventsToWait, false, INFINITE);
   if WaitResult = WAIT_OBJECT_0 then begin
     Terminate;
     Break; //Получен внешний запрос на окончание наблюдения
   end else if WaitResult <> WAIT_OBJECT_0+1 then begin
     DoOnError(SysErrorMessage(GetLastError));
     Terminate;
     Break; //Неизвестная ошибка
   end else begin
     //Закончилась операция чтения изменений в каталоге
     if not GetOverlappedResult (FDirectoryHandle, FOverlapped, BytesRead,
         false) then begin
       DoOnError(SysErrorMessage(GetLastError));
       Terminate;
       Break; //Неизвестная ошибка при попытке получения результата окончания
              //асинхронной операции ввода-вывода
     end;
     // Сейчас в буфере находится BytesRead байт информации об изменениях в
     // каталоге
     Files := TStringList.Create;
     try
       ParseNotificationBuffer (FBuffer, Files);
       for I:=0 to Pred(Files.Count) do
         DoOnNewFile(Files[I]);
     finally
       Files.Free;
     end;
   end;
 end;
end;

end.


 
Delphi5.01 ©   (2004-10-07 17:38) [2]

Thanks


 
Delphi5.01 ©   (2004-10-07 18:02) [3]

Chto eto za tip:
PFILE_NOTIFY_INFORMATION
Spasibo za pomosh


 
Игорь Шевченко ©   (2004-10-07 18:07) [4]

type
 FILE_NOTIFY_INFORMATION = packed record
   NextEntryOffset: DWORD;
   Action: DWORD;
   FileNameLength: DWORD;
   FileName: array[0..0] of WideChar;
 end;
 PFILE_NOTIFY_INFORMATION = ^FILE_NOTIFY_INFORMATION;



А что, SDK смотреть уже никак ?


 
Delphi5.01 ©   (2004-10-08 11:45) [5]

Sorry no chto est SDK i s chem ego edat ia ne znau :-)


 
Игорь Шевченко ©   (2004-10-08 12:07) [6]

Delphi5.01 ©   (08.10.04 11:45) [5]

SDK - Software Development Kit.

http://msdn.microsoft.com


 
Delphi5.01 ©   (2004-10-08 20:09) [7]

Kstati k slovu MSDN na 3 CD u mena est no ne nravitsa mne eta dokumentacia, slishkom suhaia dla edi!


 
Игорь Шевченко ©   (2004-10-08 22:07) [8]

Delphi5.01 ©   (08.10.04 20:09) [7]


> no ne nravitsa mne eta dokumentacia


Твои проблемы.

Мне вот тоже не нравится тратить свой трафик на выкладывание тебе своих примеров, написанных как раз после прочтения сухой документации в MSDN.


 
Help   (2004-10-09 19:57) [9]

Da ne VAM TO BOLSHOE SPASIBO za to chto vilojili informaciu ne vsuhom vide a uje gotovoi k upatrebleniu.


 
Delphi5.01 ©   (2004-10-12 17:50) [10]

Pochemu ne rabotaet?

var
  hDir: Cardinal;
begin
 hDir:=CreateFile("C:\Documents and Settings\Admin.SERVER\Desktop",
                  GENERIC_READ or GENERIC_WRITE,
                  FILE_SHARE_READ or FILE_SHARE_WRITE,
                  nil,
                  OPEN_EXISTING,
                  FILE_FLAG_BACKUP_SEMANTICS,
                  0);
 MyThread:=TMonitorThread.Create(0,hDir);
 MyThread.OnNewFile:=OnNewFileEvent;


 
Игорь Шевченко ©   (2004-10-12 18:28) [11]

Читать MSDN. Наизусть.


 
Help   (2004-10-12 22:30) [12]

Proshu vas pomoch esli u vas est vrema Игорь Шевченко. Please ia delau vso kak v ishodnike, razbirat ishodnik net vremeni, u mena vrema i tak podjimaet!


 
Игорь Шевченко ©   (2004-10-13 10:44) [13]


>  Please ia delau vso kak v ishodnike, razbirat ishodnik
> net vremeni, u mena vrema i tak podjimaet!


Твои проблемы.


 
Delphi5.01 ©   (2004-10-13 11:55) [14]

To Игорь Шевченко
Prinimau vashe zamechanie, ustanovil polni paket MSDN, v kakoi glave po kakim kluchevim slovam iskat?
P.S. Proshu proshenia esli vi ne pravilno ponali moi post, mne ne len iskat, prosto srochno nujno bilo dostat rabochi primer. U mena zdes paru kompov lamaut hakerskimi utilitami i mne nujno napisat programu dla zapreta kopirovania exe failov na vinchester.


 
Delphi5.01 ©   (2004-10-13 12:57) [15]


 const
  FOLDER_MONITOR_BUFFER_SIZE = 65530;

 var
   FDirectoryHandle: Cardinal;
   FBuffer: PChar;
   BytesRead: DWORD;
   FOverlapped: OVERLAPPED;
   ResValue: LongBool;
begin
 FBuffer:=AllocMem(FOLDER_MONITOR_BUFFER_SIZE);
 FOverlapped.hEvent:=CreateEvent(nil, true, false, nil);

 FDirectoryHandle:=CreateFile(
   pChar("C:\Documents and Settings\Admin.SERVER\Desktop"),
   GENERIC_READ or GENERIC_WRITE,
   FILE_SHARE_READ or FILE_SHARE_WRITE,
   nil,
   OPEN_EXISTING,
   FILE_FLAG_BACKUP_SEMANTICS,
   0);

 ResValue:=ReadDirectoryChangesW(
   FDirectoryHandle,
   FBuffer,
   FOLDER_MONITOR_BUFFER_SIZE,
   false, //vedzeb mholod tviton sakagaldeshi
   FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_ATTRIBUTES,
   @BytesRead,
   @FOverlapped,
   nil);
 if ResValue then
   form1.ListBox1.Items.Add("davichire ragac cvlileba");
 Application.ProcessMessages;

Sha nado eto v potok zakinut, i razobratsa kak iz [b]FBuffer[/b] vitaskivat imena failov! Nadeus ia mogu raschitivat na vashu pomosh?
P.S. Spasibo chto nauchili ribu lovit a ne nakormili odin raz! :D


 
Игорь Шевченко ©   (2004-10-13 13:31) [16]


> v kakoi glave po kakim kluchevim slovam iskat?


ReadDirectoryChangesW


> U mena zdes paru kompov lamaut hakerskimi utilitami i mne
> nujno napisat programu dla zapreta kopirovania exe failov
> na vinchester.


NTFS + права на каталоги/диски/файлы


 
Delphi5.01 ©   (2004-10-13 21:47) [17]

Ne poslednee ne podhodit, u mena lamaut exe utilitoi, i za neskolko sekund poluchaut prava administratora! Ia uje k profi obrashalsa na forumah tipa forum.ru-board.com no krome etogo nichego ne pomojet! :D



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

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

Наверх




Память: 0.5 MB
Время: 0.055 c
3-1098990128
Vova
2004-10-28 23:02
2004.11.28
Query1.FieldCount всегда возвращает одно значение


14-1100084773
Holy
2004-11-10 14:06
2004.11.28
О нечистой силе, компах и бубне...


8-1094074341
zero-g
2004-09-02 01:32
2004.11.28
Строка состояния в видео проигрывателе


14-1100316127
DelphiN!
2004-11-13 06:22
2004.11.28
Выявление ошибок в программе


14-1100262319
ПЛОВ
2004-11-12 15:25
2004.11.28
Помогите придумать название...





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