Как получить пакет Windows или скрипт Perl для запуска при добавлении файла в каталог? - PullRequest
4 голосов
/ 17 сентября 2009

Я пытаюсь написать скрипт, который будет анализировать локальный файл и загружать его содержимое в базу данных MySQL. Сейчас я думаю, что пакетный скрипт, который запускает Perl-скрипт, будет работать, но я не уверен, что это лучший способ для достижения этой цели.

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

Мысли? Обратная связь? Я довольно новичок в пакетных сценариях Perl и Windows, поэтому любые рекомендации приветствуются.

Ответы [ 6 ]

9 голосов
/ 17 сентября 2009

Вы можете использовать Win32 :: ChangeNotify . Ваш скрипт будет уведомлен, когда файл будет добавлен в целевой каталог.

1 голос
/ 10 марта 2011

Вы можете легко добиться этого в Perl, используя File::ChangeNotify. Этот модуль находится на CPAN: http://search.cpan.org/dist/File-ChangeNotify/lib/File/ChangeNotify.pm

Вы можете запустить код как демон или как службу, заставить его просматривать один или несколько каталогов, а затем автоматически выполнять некоторый код (или запускать скрипт), если какое-либо условие соответствует.

Лучше всего, это кроссплатформенный, так что если вы хотите переключиться на Linux-машину или Mac, он все равно будет работать.

1 голос
/ 17 сентября 2009

Требуемая функция: ReadDirectoryChangesW . Быстрый поиск оболочки Perl дает этот модуль Win32 :: ReadDirectoryChanges .

Ваш скрипт будет выглядеть примерно так:

use Win32::ReadDirectoryChanges;

$rdc = new Win32::ReadDirectoryChanges(path    => $path,
                                       subtree => 1,
                                       filter  => $filter);

while(1) {
    @results = $rdc->read_changes;

    while (scalar @results) {
      my ($action, $filename) = splice(@results, 0, 2);
      ... run script ...
    }
}
1 голос
/ 17 сентября 2009

Проверка папки для вновь созданных файлов может быть реализована с использованием функции WMI . А именно, вы можете создать Perl-скрипт, который подписывается на событие WMI __InstanceCreationEvent, которое отслеживает создание экземпляров класса CIM_DirectoryContainsFile. После того, как событие такого рода инициировано, вы знаете, что в папку был добавлен новый файл, и можете обрабатывать его по мере необходимости.

Эти статьи предоставляют больше информации по этому вопросу и содержат примеры кода VBScript (надеюсь, вам не составит труда конвертировать их в Perl):

1 голос
/ 17 сентября 2009

Было бы не сложно собрать небольшое приложение на C #, которое использует класс FileSystemWatcher для обнаружения файлов, добавляемых в папку, и затем запускает необходимый скрипт. Конечно, он будет использовать меньше ресурсов процессора / системы / пропускной способности жесткого диска, чем опрашивать папку через регулярные промежутки времени.

0 голосов
/ 10 марта 2011

Вы должны рассмотреть, что является достаточной эвристикой для определения «модифицированного».

В порядке возрастания стоимости и точности:

  1. размер файла (содержимое файла может быть изменено при условии сохранения размера)

  2. метка времени файла (если вы не используете ntpd, время не монотонно)

  3. файл sha1sum (пуленепробиваемый, но дорогой)

Я бы запустил ntpd, а затем перебрал метки времени, а затем сравнил контрольную сумму, если метка времени изменилась. Это может покрыть много земли за короткое время.

Эти методы не подходят для приложений компьютерной безопасности, они предназначены для управления файлами в нормальной системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...