Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadDirectoryChangesW, подробнее, если можно... 
:(
    Опции темы
Maverick
  Дата 7.4.2004, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Posol.... Вы упомянули ReadDirectoryChangesW для слежения за каталогом... У меня в некоторых прогах такое наворочено в этих целях, что вообще-то стало стыдно.... Help у меня на эту функцию не отзывается... Она что в какую-то библиотеку входит стороннюю, или апишная? Да и как-то я механизм даже понять не могу....

Нельзя ли по-подробнее.... Заранее благодарен....



--------------------
smile
PM ICQ GTalk   Вверх
Susel
Дата 7.4.2004, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 27.3.2004

Репутация: нет
Всего: нет



Серж, запусти Пуск|Программы|Borland Delphi 6.0|Help|MS SDK Help Filses|Win32 Programmer's Reference...
Мог бы просто позвонить или зайти... biggrin.gif biggrin.gif biggrin.gif
PM MAIL   Вверх
Maverick
Дата 7.4.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Susel, спасибо..... но ты же Дельфи не любишь... не хотел мучить....

The ReadDirectoryChangesW function returns information describing the changes occurring within a directory.

Это я подозревал.... Но как ей пользоваться? Ведь Posol упоминал, что она сама следить будет.... Все равно не понимаю как, ведь это не событие, оно не возникает само от факта изменения в каталоге.... Значит ее все-таки надо запускать с промежутком во времени....? в чем тогда выйгрыш?

кому интересно начало, то оно вот здесь.... в конце....
http://forum.vingrad.ru/index.php?showtopic=20799



--------------------
smile
PM ICQ GTalk   Вверх
p0s0l
Дата 7.4.2004, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Сам когда-то пробовал, щас довёл до ума...
Там 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 будет асинхронной... Ну это кому как удобнее...


Присоединённый файл ( Кол-во скачиваний: 267 )
Присоединённый файл  ChangeNotify.zip


--------------------
С уважением, г-н Посол.
PM   Вверх
Maverick
Дата 8.4.2004, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Спасибо огромное.... Сколько иногда ненужной работы делаем.... по незнанию.... Сколько раз убеждаюсь....


--------------------
smile
PM ICQ GTalk   Вверх
2fank
Дата 3.4.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



А как следить за сетевой папкой?
PM MAIL   Вверх
dma
Дата 3.4.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 1.12.2006
Где: Belarus, Minsk

Репутация: нет
Всего: 1



указать сетевой путь, и будет следить за сетевой папкой
PM MAIL ICQ Skype GTalk   Вверх
Alexeis
Дата 3.4.2008, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



  В принципе, директория это тоже файл, но будет ли это работать для сетевых? Ведь на своем диске можно сделать придумать событие для драйвера HDD, которое буде оповещать о таких вещах, а как такое сделать для чужого драйвера?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
2fank
Дата 3.4.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



Цитата(dma @ 3.4.2008,  18:48)
указать сетевой путь, и будет следить за сетевой папкой

указал "\\mycomp\1" - не работает

Updated
оказывается нужно сменить
Код

BufSize := 16*1024*1024; // 16 mb

на
Код

BufSize := 64*1024;


Цитата

ReadDirectoryChangesW fails with ERROR_INVALID_PARAMETER when the buffer length is greater than 64 KB and the application is monitoring a directory over the network. This is due to a packet size limitation with the underlying file sharing protocols: Server Message Block (SMB) on Windows Me/98/95, and Common Internet File System (CIFS) on Windows Server 2003/XP/2000.


Это сообщение отредактировал(а) 2fank - 3.4.2008, 22:55
PM MAIL   Вверх
corpsehunter
Дата 29.7.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 24.2.2007

Репутация: нет
Всего: 3



а если вешаешь это слежение на флэху, то она блокирует ее и не дает извлечь. Можно это как-нибудь исправить?
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
Riply
Дата 30.7.2008, 07:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(corpsehunter @  29.7.2008,  10:26 Найти цитируемый пост)
а если вешаешь это слежение на флэху, то она блокирует ее и не дает извлечь


Ничего удивительного: у нас есть открытые Handl`ы, вот система и говорит, что работа с флешкой не закончена. 
Если я не ошибаюсь, то единственно возможное решение: отлавливать "попытку безопасного отключения" и снимать слежение.
PM MAIL   Вверх
corpsehunter
Дата 30.7.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 24.2.2007

Репутация: нет
Всего: 3



Цитата(Riply @ 30.7.2008,  07:43)
Если я не ошибаюсь, то единственно возможное решение: отлавливать "попытку безопасного отключения" и снимать слежение.

ну это логично, и мне это же приходило в голову... а как его отлавливать? оО
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
zhefran
Дата 17.9.2008, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



В коде p0s0l, есть один нюанс из-за которого нельзя переименовать файлы и папки в корне каталога.
Там нужно добавить при создание хэндла такое:
 
Код

hDir := CreateFile(PChar(Dir),
                     FILE_LIST_DIRECTORY,
                     FILE_SHARE_READ or FILE_SHARE_DELETE or FILE_SHARE_WRITE, //Добавлено or FILE_SHARE_WRITE.
                     nil,
                     OPEN_EXISTING,
                     FILE_FLAG_BACKUP_SEMANTICS,
                     0);

--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
zhefran
Дата 23.9.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 27.9.2007
Где: Винница-Киев-Ирпе нь-?, Украина

Репутация: нет
Всего: нет



Нашел при исполнения кода еще один нюанс! При попытке остановки роботы потока кнопкой, поток все равно продолжает свою роботу!!! smile 
--------------------
Ніщо нізвідки не виникає і нікуди не дівається!Лечение компьютеров от вирусов! Бесплатно!
PM MAIL WWW ICQ   Вверх
Qu1nt
Дата 23.9.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 5
Всего: 50



Могу предположить:
ThreadForScan:
Код

  until False or Terminated; // чтобы цикл знал, когда ему необходимо остановиться)

DlgMain:
Код

  Thread1 := TScanThread.Create(False, edDir.Text, cbSubDirs.Checked);
  Thread1.FreeOnTerminate := True; // во избежание утечек памяти = )


Это сообщение отредактировал(а) Qu1nt - 23.9.2008, 13:11
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1203 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.