Автор Тема: Файловый монитор  (Прочитано 3467 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Файловый монитор
« : 28 Апреля 2005, 09:51:47 »
Привет всем! Не являясь большим спецециалистом по PERL\'у, иногда предпочитаю писать на нём. Особенно учитывая все его прелести. Поэтому, если вопросы будут дурацкие - уж извиняйте.
Есть проблема: на Win серваке нужно мониторить каталог на предмет изменения и добавления файлов. Файлы в формате CSV. Каждый день добавляется новый файл и в него весь день пишется инфа. Все изменения нужно сбрасывать в SQL. Сейчас работает следующий вариант: на SQL серваке крутиться DTS пакет который раз в день забирает с расшаренной директории новый файл(за прошедший день) и закачивает его в базу. Нужно, что бы изменения отражались в базе не раз в день, а сразу. Ну и как-то покрасивее хочется сделать.
Решил написать скрипт, который на серваке с файлами крутился бы в фоне и мониторил каталог.
Всё что нарыл - Win32::ChangeNotify

use strict;
require Win32::ChangeNotify;
my $Path=\'D:\\DATA\';
my $WatchSubTree=1;
my $Events=\'LAST_WRITE\';
my $notify=Win32::ChangeNotify->new($Path,$WatchSubTree,$Events);
$notify->wait();
print "Something changed\\n";

И то как-то криво работает. Как в цикл загнать - непонятно. Как получить,что конкретно изменилось - тоже не знаю.

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Файловый монитор
« Ответ #1 : 28 Апреля 2005, 11:46:34 »
С циклом разобрался (PrimalScript перехватывал вывод):

use strict;
require Win32::ChangeNotify;
my $Path=\'D:\\DATA\';
my $WatchSubTree=1;
my $Events=\'LAST_WRITE\';
my $objNotify=Win32::ChangeNotify->new($Path,$WatchSubTree,$Events);
while (1) {
    $objNotify->wait();
    print "Something changed\\n";
    $objNotify->reset();
}
$objNotify->close();

А как узанть, что конкретно изменилось в каталоге? Какой файл и что в него дописалось?
print $objNotify выдаёт Win32::ChangeNotify=SCALAR(0xbe7c94)
И что с этим делать??????

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Файловый монитор
« Ответ #2 : 29 Апреля 2005, 10:45:22 »
В отладчике посмотрите дамп объекта $objNotify - возможно это решит еще один вопрос. (вывести дамп можно так:
DB> x $objNotify

)
Ворота в perl - perlmonks.org.ru

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Файловый монитор
« Ответ #3 : 29 Апреля 2005, 11:57:04 »
Отладчик всё время пишет:
0  Win32::ChangeNotify=SCALAR(0x15d5224)
   -> 88
Ничего не меняется с момента инициализации $objNotify и до выхода.
Если ещё раз запустить изменяется то что в скобках и после стрелки????????

Оффлайн cr4ck3r

  • Фанат Perl
  • Постоялец
  • ***
  • Сообщений: 146
  • +0/-0
  • 2
    • Просмотр профиля
    • http://perlmonks.org.ru
Файловый монитор
« Ответ #4 : 02 Мая 2005, 19:57:09 »
Так тебе нужен дамп. А не просто print.
Ты пробовал через \'x\' выводить дамп и что он пишет? Вообще гуевые отладчики очень удобны в некоторых случаях, типа komodo или из набора PDK.
Ворота в perl - perlmonks.org.ru

Оффлайн Wells

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Файловый монитор
« Ответ #5 : 06 Мая 2005, 10:59:49 »
Ну поставил я себе Komodo.
И как там посмотреть???
Если запустить дебагинг, то после шага my $objNotify=...
$objNotify становится равен Win32::ChangeNotify=SCALAR(0x15d5224).
И все

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28