![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Может у кого есть пример как использовать ReadDirectoryChangesW? [D6, D7, WinXP]
Delphi5.01 © (2004-10-07 14:25:00)Мне кажется из топика все ясно.
Большое спасибо
Delphi5.01 (2004-10-13 21:47:00) [1]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
Игорь Шевченко (2004-10-13 13:31:00) [2]
> 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 12:57:00) [3]
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
Delphi5.01 (2004-10-13 11:55:00) [4]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.
Игорь Шевченко (2004-10-13 10:44:00) [5]
> Please ia delau vso kak v ishodnike, razbirat ishodnik
> net vremeni, u mena vrema i tak podjimaet!
Твои проблемы.
Help (2004-10-12 22:30:00) [6]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-12 18:28:00) [7]Читать MSDN. Наизусть.
Delphi5.01 (2004-10-12 17:50:00) [8]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;
Help (2004-10-09 19:57:00) [9]Da ne VAM TO BOLSHOE SPASIBO za to chto vilojili informaciu ne vsuhom vide a uje gotovoi k upatrebleniu.
Игорь Шевченко (2004-10-08 22:07:00) [10]Delphi5.01 © (08.10.04 20:09) [7]
> no ne nravitsa mne eta dokumentacia
Твои проблемы.
Мне вот тоже не нравится тратить свой трафик на выкладывание тебе своих примеров, написанных как раз после прочтения сухой документации в MSDN.
Delphi5.01 (2004-10-08 20:09:00) [11]Kstati k slovu MSDN na 3 CD u mena est no ne nravitsa mne eta dokumentacia, slishkom suhaia dla edi!
Игорь Шевченко (2004-10-08 12:07:00) [12]Delphi5.01 © (08.10.04 11:45) [5]
SDK - Software Development Kit.
http://msdn.microsoft.com
Delphi5.01 (2004-10-08 11:45:00) [13]Sorry no chto est SDK i s chem ego edat ia ne znau :-)
Игорь Шевченко (2004-10-07 18:07:00) [14]
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-07 18:02:00) [15]Chto eto za tip:
PFILE_NOTIFY_INFORMATION
Spasibo za pomosh
Delphi5.01 (2004-10-07 17:38:00) [16]Thanks
Игорь Шевченко (2004-10-07 14:27:00) [17]
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.