>... Кстати, интересно, в винде есть что-то вроде inotify для отслеживания изменения директории, не сканируя ее? ...Вы наверное не в курсе что это очень давно в виндах было, а в линухах это появилось значительно позже винды, кажется несколько лет назад. Причем в очередном новом ядре поменяли реализацию:
http://www.opennet.ru/opennews/art.shtml?num=23357
"...
fsnotify - новая реализация механизма для слежения за событиями в файловой системе, представляющая собой переработанный вариант inotify и dnotify, основанный на использовании новой инфраструктуры нотификации в VFS;
...
"
А вот что было когда-то (и есть сейчас) в винде (правда в ветке Win9x этого нет, присутствует в NT-ветке с Win NT3.1 c 3-м сервиспаком):
function ReadDirectoryChangesW(
hDirectory: THandle; // описатель каталога, за которым надо следить
lpBuffer: Pointer; // Указатель на буфер, в который будет записана информация
nBufferLength: DWORD; // Размер буфера
bWatchSubtree: Bool; // Следить ли за подкаталогами
dwNotifyFilter: DWORD; // Фильтр действий
lpBytesReturned: LPDWORD; // Сколько было записано в буфер
lpOverlapped: POverlapped; // Для асинхронной работы
lpCompletionRoutine: FARPROC // Функция, которая будет вызвана при окончании операции
): BOOL; stdcall;
вот за какими действиями можно было следить:
Параметр функции dwNotifyFilter - действия, информацию о которых мы хотим получать.
FILE_NOTIFY_CHANGE_FILE_NAME - создание, удаление, переименование файла.
FILE_NOTIFY_CHANGE_DIR_NAME - созданием и удаление каталога.
FILE_NOTIFY_CHANGE_ATTRIBUTES - изменение атрибутов файла.
FILE_NOTIFY_CHANGE_SIZE - изменение размера файла.
FILE_NOTIFY_CHANGE_LAST_WRITE - изменение файла (это и предыдущее уведомление будет получено только в момент реальной записи файла на диск).
FILE_NOTIFY_CHANGE_LAST_ACCESS - изменение времени последнего доступа.
FILE_NOTIFY_CHANGE_CREATION - изменение времени создания файла.
FILE_NOTIFY_CHANGE_SECURITY - изменение параметров безопасности (прав доступа и т.д.)
Но было еще и другое:
FindFirstChangeNotification:
Creates a change notification handle and sets up initial change notification filter conditions. A wait on a notification handle succeeds when a change matching the filter conditions occurs in the specified directory or subtree. The function does not report changes to the specified directory itself.
This function does not indicate the change that satisfied the wait condition. To retrieve information about the specific change as part of the notification, use the ReadDirectoryChangesW function.
FindNextChangeNotification
С помощью этих функций можно было создать массив "объектов ожидания" (wait objects), и войдя в MsgWaitForMultipleObjects ожидать пока какой-то из объектов в массиве не стрельнет (объект ожидания созданный через FindFirstChangeNotification - это объект ожидания для ФС, но вообще там можно свои произвольные объекты ожидания создавать). Само собой такое лучше делать в отдельном потоке.
Вот кусочки работавшего еще в 2003 году Дельфийского кода (потока ожидания):
StopEvent := CreateEvent(nil, True, False, '');
Win32Check(LongBool(StopEvent));
WaitObjects[0] := ...
WaitObjects[1] := StopEvent;
WaitObjects[2] := FindFirstChangeNotification(PChar(Folder),False, FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_LAST_WRITE);
if WaitObjects[2] = INVALID_HANDLE_VALUE then begin
...
Win32Check(False);
end;
while not Terminated do begin
WaitCode := MsgWaitForMultipleObjects(3,WaitObjects,False,INFINITE,QS_ALLINPUT+QS_ALLPOSTMESSAGE);
if WaitCode = WAIT_OBJECT_0 then
...
else
if WaitCode = WAIT_OBJECT_0+2 then begin
OnFolderEventProc();
FindNextChangeNotification(WaitObjects[WaitCode]);
if WaitObjects[WaitCode] = INVALID_HANDLE_VALUE then Win32Check(False);
end else
if WaitCode = WAIT_OBJECT_0+1 then
Terminate
else
...
У нас в старом древнем банк-клиенте 2000-го года (который уже заменен новым) использовался виндовый механизм подписки на события файловой системы.
А в линухе, помнится, долго ждал пока появятся эти нотификации, так же как в свое время и просто асинхронный ввод-вывод.
Так что при всей моей нелюбви к майкрософту не надо перевирать факты