Проверить, какие файлы изменились в Mac::FSEvents в Perl?

Можно ли увидеть, какие файлы были изменены всякий раз, когда вызывается событие изменения, используя: https://metacpan.org/pod/Mac::FSEvents ?

Большое спасибо! :)


person Eax    schedule 20.06.2012    source источник


Ответы (1)


API событий файловой системы был разработан для отражения изменений в большом дереве файлов, если вы хотите отразить изменения в определенных файлах, вам лучше использовать IO::KQueue. В привязке Perl отсутствует несколько констант для флагов событий, но вы можете получить их на странице Руководство по программированию событий файловой системы.

Этот сценарий должен помочь вам начать работу, он распечатывает любые события файла в '/path'

#!/usr/bin/perl
use strict;
use warnings;

use IO::Select    qw[];
use Mac::FSEvents qw[FILE_EVENTS];

my $fse = Mac::FSEvents->new({
    path  => '/path',
    flags => FILE_EVENTS
});

my $select = IO::Select->new($fse->watch);

# http://developer.apple.com/library/mac/#documentation/Darwin/Reference/FSEvents_Ref/FSEvents_h/index.html#//apple_ref/c/tag/FSEventStreamEventFlags
my %names = reverse (
    kFSEventStreamEventFlagNone              => 0x00000000,
    kFSEventStreamEventFlagMustScanSubDirs   => 0x00000001,
    kFSEventStreamEventFlagUserDropped       => 0x00000002,
    kFSEventStreamEventFlagKernelDropped     => 0x00000004,
    kFSEventStreamEventFlagEventIdsWrapped   => 0x00000008,
    kFSEventStreamEventFlagHistoryDone       => 0x00000010,
    kFSEventStreamEventFlagRootChanged       => 0x00000020,
    kFSEventStreamEventFlagMount             => 0x00000040,
    kFSEventStreamEventFlagUnmount           => 0x00000080,
    kFSEventStreamEventFlagItemCreated       => 0x00000100,
    kFSEventStreamEventFlagItemRemoved       => 0x00000200,
    kFSEventStreamEventFlagItemInodeMetaMod  => 0x00000400,
    kFSEventStreamEventFlagItemRenamed       => 0x00000800,
    kFSEventStreamEventFlagItemModified      => 0x00001000,
    kFSEventStreamEventFlagItemFinderInfoMod => 0x00002000,
    kFSEventStreamEventFlagItemChangeOwner   => 0x00004000,
    kFSEventStreamEventFlagItemXattrMod      => 0x00008000,
    kFSEventStreamEventFlagItemIsFile        => 0x00010000,
    kFSEventStreamEventFlagItemIsDir         => 0x00020000,
    kFSEventStreamEventFlagItemIsSymlink     => 0x00040000
);

use constant kFSEventStreamEventFlagItemIsFile => 0x00010000;

while ($select->can_read) {
    for my $event ($fse->read_events) {
        my $flags = $event->flags;
        my @names;

        next unless $flags & kFSEventStreamEventFlagItemIsFile;

        while ((my $flag = $flags & -$flags) != 0) {
            push @names, $names{$flag} || sprintf '0x%.8X';
            $flags &= ~$flag;
        }

        printf qq['%s': %s\n], $event->path, join ' | ', @names;
    }
}
$fse->stop;

Примеры событий:

$ echo foo > foo.txt
'/path/foo.txt': kFSEventStreamEventFlagItemCreated | kFSEventStreamEventFlagItemModified | kFSEventStreamEventFlagItemIsFile

$ touch foo.txt
'/path/foo.txt': kFSEventStreamEventFlagItemInodeMetaMod | kFSEventStreamEventFlagItemIsFile

$ echo foo >> foo.txt
'/path/foo.txt': kFSEventStreamEventFlagItemModified | kFSEventStreamEventFlagItemIsFile

$ mv foo.txt bar.txt
'/path/foo.txt': kFSEventStreamEventFlagItemRenamed | kFSEventStreamEventFlagItemIsFile
'/path/bar.txt': kFSEventStreamEventFlagItemRenamed | kFSEventStreamEventFlagItemIsFile

$ rm bar.txt
'/path/bar.txt': kFSEventStreamEventFlagItemRemoved | kFSEventStreamEventFlagItemIsFile
person chansen    schedule 21.06.2012