The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Интервью с Вячеславом Калошиным по вопросу перевода предприя..."
Отправлено Еще один аноним, 11-Сен-09 11:35 
>... Кстати, интересно, в винде есть что-то вроде 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-го года (который уже заменен новым) использовался виндовый механизм подписки на события файловой системы.

  А в линухе, помнится, долго ждал пока появятся эти нотификации, так же как в свое время и просто асинхронный ввод-вывод.

Так что при всей моей нелюбви к майкрософту не надо перевирать факты

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру