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

Вниз

Может у кого есть пример как использовать 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 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.044 c
1-1100242872
Alex P
2004-11-12 10:01
2004.11.28
Создание программы в виде процессса windows


4-1097742124
Slonco
2004-10-14 12:22
2004.11.28
Как издать звук через beeper?


1-1100599317
Брат
2004-11-16 13:01
2004.11.28
Динамическое создание формы


3-1098888910
ILUHA
2004-10-27 18:55
2004.11.28
Шифрование передаваемых данных


3-1099414350
Arximed
2004-11-02 19:52
2004.11.28
Перенос данных