Форум: "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