Как обнаружить изменение размера каталога в Perl - PullRequest
3 голосов
/ 07 июня 2010

Я пытаюсь найти способ отслеживания каталогов в Perl, в частности размера каталога, и при обнаружении изменения размера каталога выполнить определенное действие.
Проблема, с которой я сталкиваюсь, связана с большими файлами, которыетребуется значительное количество времени для копирования в этот каталог, т. е.> 100 МБ.Что происходит (в Windows, а не в Unix), система резервирует достаточно дискового пространства для всего файла, даже если файл все еще копируется.Это вызывает проблемы для меня, потому что мой сценарий попытается выполнить действие с этим файлом, который не завершил копирование.Я легко могу обнаружить изменения размера каталога в Unix через 'du', но 'du' в Windows не ведет себя так же.

Существуют ли точные методы обнаружения изменений размера каталога в Perl?

Редактировать: некоторые моменты, которые необходимо уточнить: - Мой сценарий Perl отслеживает только конкретный каталог и, обнаружив новый файл или новый каталог, выполняет действие с этим новым файлом или каталогом.Это не копирование каких-либо файлов;пользователи в сети будут копировать файлы в каталог, который я отслеживаю.- Проблема возникает, когда появляется новый файл или каталог (скопированный, не перемещенный), который имеет значительный размер (> 100 МБ, но обычно составляет пару ГБ) и моя программа запускается до завершения этой копии - В Unix я могулегко 'du', чтобы увидеть, что рассматриваемый файл / каталог увеличивается в размере, и предпринять соответствующее действие - в Windows размер статичен, поэтому я не могу обнаружить это изменение - opendir / readdir / closedir не представляется возможным, так как некоторыеотображаемые каталоги могут содержать тысячи файлов, и я хочу избежать издержек

В идеале я хотел бы, чтобы моя программа запускалась при изменении, но я не уверен, как это сделать.На данный момент он занят, ждет, пока не обнаружит изменение.Изменение размера файла / каталога не в моих силах.

Ответы [ 5 ]

3 голосов
/ 08 июня 2010

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

РЕДАКТИРОВАТЬ: File :: ChangeNotify кажется лучшим вариантом (кроссплатформенный и используется Catalyst )

3 голосов
/ 07 июня 2010

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

1 голос
/ 08 июня 2010

Насколько я понимаю, вы опрашиваете каталог с тысячами файлов. Когда вы видите новый файл, в нем выполняется действие. Это вызывает проблемы, если файл используется или все еще копируется, правильно?

Возможны несколько решений:

1) Используйте flock , чтобы определить, используется ли файл другим процессом (проверьте, правильно ли он работает в вашей ОС, файловой системе и версии Perl).

2) Использование вызова LockFile в Windows. Если это не удается, ОС или другой процесс использует этот файл.

3) Измените интервал опроса на незанятое время на сервере и отключите каталог, пока ваш процесс завершится.

0 голосов
/ 09 августа 2010

Есть хороший модуль под названием File :: Monitor, он будет обнаруживать новые файлы, удаленные файлы, изменения в размере и любые другие атрибуты, которые можно сделать с помощью stat. Затем он пойдет и выложит файлы для вас.

http://metacpan.org/pod/File::Monitor

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

$monitor->watch( {
    name        => 'somedir',
    recurse     => 1,
    callback    => {
        files_created => sub {
            my ($name, $event, $change) = @_;
            # Do stuff
        }
    }
} );

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

0 голосов
/ 07 июня 2010

Оценка размера каталога - это то, что должны делать только самые неопытные программисты на Perl. Вы можете написать свою собственную портативную версию du в 15 строках кода, если знаете о:

  1. Либо glob, либо opendir / readdir / closedir для перебора файлов в каталоге
  2. Операторы проверки файлов (-f file, -d file и т. Д.) Для различения обычных файлов и имен каталогов
  3. Функция stat или оператор размера файла -s file для получения размера файла
...