Как автоматически копировать файлы на жесткий диск с USB-устройства при подключении с помощью Perl? - PullRequest
0 голосов
/ 03 марта 2010

Мое текущее мышление: мне нужен определенный модуль, который позволит мне получить доступ к USB-устройству. Кроме того, мне нужна какая-то дьявольская вещь, которая будет уведомлять мой скрипт о любом входящем событии USB-соединения. А затем я просто использую некоторое регулярное выражение, чтобы найти файл, который хочу скопировать, а затем делаю копирование, возможно, с помощью какого-либо модуля копирования файлов.

Но я искал CPAN с ключевым словом «USB» только для того, чтобы найти действительно очень мало соответствующих модулей, и этот, казалось бы, самый многообещающий модуль, называемый Device :: USB, говорит, что не поддерживает систему Windows. Я использую Windows XP SP3, кстати.

Полагаю, с Perl такого рода автоматизация не должна быть слишком сложной. Но я просто застрял там.

Есть идеи? или какие-либо другие предложения? Спасибо:)

UPDATE

Все не так просто, как ожидалось. Уверен, у меня есть чему поучиться. Но, основываясь на моих знаниях Perl, мне удалось написать сценарий make-do. Я здесь, чтобы учиться. Пожалуйста, прокомментируйте, где я могу улучшить свой код. Спасибо как всегда :)

use warnings;
use strict;
use File::Find;
use File::Copy;

my $from = 'I:/'; #Volume letter for USB drive in my OS
my $to = 'E:\Copy-to';

while (1) {
    if (-e $from) {
        last;
    }else{
        sleep(30);
    }
}

my @files;
find(sub{ push @files, $File::Find::name if /pdf$/}, $from); #Find the PDF files in the USB drive for Copying experiment

for (@files){
    copy ($_,$to);
}

Ответы [ 2 ]

1 голос
/ 03 марта 2010

Худший случай - опросить тома, чтобы найти его (ищите подключенные диски каждые несколько секунд). Примерно так в Perl довольно сложно, если только вы не хотите запачкать руки и подключиться к системе событий Windows.

Идеально, очевидно, подключиться к встроенной подсистеме USB-уведомлений Windows от C. Если у вашей флешки есть эмуляция CD-ROM, вы можете поставить на нее скрипт автозапуска. Я думаю, вам лучше придерживаться C, C ++ или даже C # для такого рода вещей. Perl - второй класс в Windows.

0 голосов
/ 07 марта 2010

Если кто-то (вероятно, ученик Perl, такой как я, который любит играть с Perl на Windows box) должен наткнуться на этот пост, я хотел бы, чтобы он / она увидел хорошее решение для основной части моей проблемы, которая была щедро предоставлена от Corian из Perlmonks, и меня не обольстят, как когда я впервые посмотрел на @Pestilence (без обид :)), чтобы поверить, что Perl не может прекрасно справиться с поставленной задачей. Правда в том, что Perl вполне способен справиться с такой работой и делать это очень легко.

Следующий код вставлен (дословно) из ответа Кориана на мой вопрос, размещенный в Perlmonks. Источник здесь

#!/usr/bin/perl -w
package main;
use strict;
use DBI;
use Data::Dumper;

my $dbh = DBI->connect('dbi:WMI:');

my $sth = $dbh->prepare(<<WQL);
    SELECT * FROM __instanceoperationevent
    WITHIN 5
    WHERE TargetInstance ISA 'Win32_LogicalDisk'
    and TargetInstance.Name != 'C:'
WQL
$sth->execute();

# loops forever
while (defined (my $row = $sth->fetchrow_arrayref())) {
    my $ev = $row->[0];

    # Windows XP only :(
    print "Class\t",$ev->Path_->Class,"\n";
    for (qw(Name DeviceID Caption MediaType InterfaceType)) {
        print join "\t", $_, ($ev->TargetInstance->{$_} || '<none>');
        print "\n";
        if ($ev->Path_->Class eq '__InstanceCreationEvent') {
            print "Device (letter) $ev->{TargetInstance}->{Name} added\n";
        }
    }
}

Все кредиты идут в Кориан, и я хотел бы сделать это CW.

...