У меня очень ограниченное знание использования C Builder, вы можете привести мне пример или указать мне учебник, показывающий, как использовать FindNextChangeNotification в Delphi или, если возможно, как использовать компонент C в delphi ?обнаружение изменений оболочки Windows
ответ
ReadDirectoryChanges - это функция, которую я ищу. Вот моя попытка использовать код mghie Why does ReadDirectoryChangesW omit events?
Моя цель здесь - отслеживать каталог/путь или файл, который вы увидите в Unit1. Я просто хочу, чтобы простой диалог showmessage появлялся всплывающим при каждом обнаружении изменений в местоположении. Я не могу найти, где я должен пройти процедуру или функцию уведомления. Unit2 просто сохраняет неизменный код от mghie. Когда я компилирую этот проект и делаю простые изменения в каталоге, ничего не происходит. Я правильно использую ReadDirectoryChanges?
здесь Unit1:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
fthread:TWatcherthread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//start directory or file watch here
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
fThread := TWatcherThread.Create('C:\Users\abe\Desktop\statcious\mitsu\Demo\abc.txt');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if fThread <> nil then begin
TWatcherThread(fThread).Shutdown;
fThread.Free;
end;
end;
end.
Вот Unit2:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TWatcherThread = class(TThread)
private
fChangeHandle: THandle;
fDirHandle: THandle;
fShutdownHandle: THandle;
protected
procedure Execute; override;
public
constructor Create(ADirectoryToWatch: string);
destructor Destroy; override;
procedure Shutdown;
end;
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
constructor TWatcherThread.Create(ADirectoryToWatch: string);
const
FILE_LIST_DIRECTORY = 1;
begin
inherited Create(TRUE);
fChangeHandle := CreateEvent(nil, FALSE, FALSE, nil);
fDirHandle := CreateFile(PChar(ADirectoryToWatch),
FILE_LIST_DIRECTORY or GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);
fShutdownHandle := CreateEvent(nil, FALSE, FALSE, nil);
Resume;
end;
destructor TWatcherThread.Destroy;
begin
if fDirHandle <> INVALID_HANDLE_VALUE then
CloseHandle(fDirHandle);
if fChangeHandle <> 0 then
CloseHandle(fChangeHandle);
if fShutdownHandle <> 0 then
CloseHandle(fShutdownHandle);
inherited Destroy;
end;
procedure TWatcherThread.Execute;
type
PFileNotifyInformation = ^TFileNotifyInformation;
TFileNotifyInformation = record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: WideChar;
end;
const
BufferLength = 65536;
var
Filter, BytesRead: DWORD;
InfoPointer: PFileNotifyInformation;
Offset, NextOffset: DWORD;
Buffer: array[0..BufferLength - 1] of byte;
Overlap: TOverlapped;
Events: array[0..1] of THandle;
WaitResult: DWORD;
FileName, s: string;
begin
if fDirHandle <> INVALID_HANDLE_VALUE then begin
Filter := FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME
or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_LAST_WRITE;
FillChar(Overlap, SizeOf(TOverlapped), 0);
Overlap.hEvent := fChangeHandle;
Events[0] := fChangeHandle;
Events[1] := fShutdownHandle;
while not Terminated do begin
if ReadDirectoryChangesW (fDirHandle, @Buffer[0], BufferLength, TRUE,
Filter, @BytesRead, @Overlap, nil)
then begin
WaitResult := WaitForMultipleObjects(2, @Events[0], FALSE, INFINITE);
if WaitResult = WAIT_OBJECT_0 then begin
InfoPointer := @Buffer[0];
Offset := 0;
repeat
NextOffset := InfoPointer.NextEntryOffset;
FileName := WideCharLenToString(@InfoPointer.FileName,
InfoPointer.FileNameLength);
SetLength(FileName, StrLen(PChar(FileName)));
s := Format('[%d] Action: %.8xh, File: "%s"',
[Offset, InfoPointer.Action, FileName]);
OutputDebugString(PChar(s));
PByte(InfoPointer) := PByte(DWORD(InfoPointer) + NextOffset);
Offset := Offset + NextOffset;
until NextOffset = 0;
end;
end;
end;
end;
end;
procedure TWatcherThread.Shutdown;
begin
Terminate;
if fShutdownHandle <> 0 then
SetEvent(fShutdownHandle);
end;
end.
Пожалуйста, используйте отступ в 4 пробела для всего вашего кода, или никто не сможет его прочитать. – jpfollenius
Почему вы делаете это в потоке, а не в основной программе? Возможно, основная программа отключается до того, как будут замечены какие-либо изменения. Кроме того, что устанавливает «завершенную» переменную? –
Один из вариантов - использование компонента TJvChangeNotify, поддержка JVCL Delphi и C++ Builder.
Другой вариант - использовать функцию SHChangeNotifyRegister. посмотреть эту ссылку Monitoring System Shell Changes using Delphi
До свидания.
- 1. обнаружение изменений оболочки Windows
- 2. Обнаружение изменений в window.location
- 3. Обнаружение изменений в EntityFrameWork
- 4. AngularJS: обнаружение изменений формы
- 5. Обнаружение несохраненных изменений
- 6. Обнаружение изменений активности
- 7. Обнаружение изменений содержимого UITextField
- 8. Обнаружение резких изменений значений
- 9. Обнаружение параллельных изменений
- 10. Обнаружение изменений в UISwitch
- 11. Обнаружение изменений разрешения видеосигнала
- 12. обнаружение изменений на видеокадрах
- 13. Обнаружение одновременных изменений?
- 14. Обнаружение изменений в ReactJS
- 15. Обнаружение изменений автофильтра
- 16. angular2 @input - обнаружение изменений
- 17. Обнаружение изменений высоты DIV
- 18. обнаружение изменений URL-адресов
- 19. Обнаружение изменений в поплавке
- 20. Обнаружение изменений на URL
- 21. Windows 10 UWP - программное обнаружение изменений в функциях разработчика
- 22. Обнаружение изменений в файлах iCal
- 23. Обнаружение изменений в отключенном поле
- 24. Обнаружение изменений файла в TFS
- 25. Угловое обнаружение изменений в обслуживании
- 26. Обнаружение значительных изменений в данных
- 27. Обнаружение изменений и материал 2
- 28. Обнаружение изменений на входном массиве
- 29. Обнаружение изменений каталога в unix
- 30. Обнаружение изменений в Угловом 2
Я хотел бы использовать ReadDirectoryChangesW вместо FindFirstChangeNotification и FindNextChangeNotification (если вам действительно нужно поддерживать Windows 95/98/SE/Me). –