Сам когда-то пробовал, щас довёл до ума... Там ReadDirectoryChangesW в потоке живёт (для удобства)...
Вот он: zip 5 кб... Добавлено @ 21:55 Если влом качать, то вот само слежение:
| Код | var Dir : string = 'C:\'; \\ имя каталога SubDirs : boolean; \\ следить за подкаталогами ?
type FILE_NOTIFY_INFORMATION = record NextEntryOffset: DWORD; Action: DWORD; FileNameLength: DWORD; FileName: array [0..0] of WCHAR; end;
var hDir : THandle; Buf : pointer; Returned, BufSize : dword; adr : DWORD; fni : ^FILE_NOTIFY_INFORMATION absolute adr; s : string; ws : WideString;
const wcs = SizeOf(WideChar); // = 2 FILE_LIST_DIRECTORY = ($0001); // directory
begin hDir := CreateFile(PChar(Dir), FILE_LIST_DIRECTORY, FILE_SHARE_READ or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
if hDir = INVALID_HANDLE_VALUE then Exit;
BufSize := 16*1024*1024; // 16 mb GetMem(Buf, BufSize);
repeat if ReadDirectoryChangesW(hDir, Buf, BufSize, SubDirs, FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_LAST_ACCESS or FILE_NOTIFY_CHANGE_CREATION or FILE_NOTIFY_CHANGE_SECURITY, @Returned, nil, nil) then begin Adr := Cardinal(Buf); while Adr < (Cardinal(Buf) + Returned) do begin case fni^.Action of FILE_ACTION_ADDED : s := 'Added'; FILE_ACTION_REMOVED : s := 'Removed'; FILE_ACTION_MODIFIED : s := 'Modified'; FILE_ACTION_RENAMED_OLD_NAME : s := 'Renamed from'; FILE_ACTION_RENAMED_NEW_NAME : s := 'Renamed to'; else s := '0x' + IntToHex(fni^.Action, 8); end; SetLength(ws, fni^.FileNameLength div wcs); Move(fni^.FileName, ws[1], fni^.FileNameLength); ListBox1.Items.Add(s + ' "' + ws + '"'); Inc(adr, fni^.FileNameLength - wcs + SizeOf(fni^)); end; end; until False; CloseHandle(hDir); FreeMem(Buf); end; |
| Цитата | | Все равно не понимаю как, ведь это не событие, оно не возникает само от факта изменения в каталоге... |
Да нет вообще-то, при изменении содержимого каталога генерятся события, их можно дождаться с помощью FindFirstChangeNotification / FindNextChangeNotification + WaitFor*Object... А ReadDirectoryChangesW сама дожидается следующего изменения, при этом выполнение потока приостанавливается. Правда, можно в CreateFile указать FILE_FLAG_OVERLAPPED, тогда ReadDirectoryChangesW будет асинхронной... Ну это кому как удобнее... |