2010-03-02 6 views
5

Ich habe mich gefragt, ob es eine Möglichkeit gibt, auf die Aktualisierung einer Datei zu warten und sie dann zu lesen, sobald sie aktualisiert wurde. Also, wenn ich file.txt habe, möchte ich warten, bis etwas neues geschrieben wird, und dann lesen Sie es/bearbeiten Sie es/etc. Momentan lese ich mit Time::HiRes::sleep(.01), aber ich frage mich, ob es einen besseren Weg gibt. Vielen Dank.Was ist ein guter Weg zu warten, bis eine Datei aktualisiert und dann in Perl gelesen?

Antwort

9

Ja, es gibt einen besseren Weg. Unter Windows können Sie die FileSystemWatcher Schnittstelle verwenden, unter Linux inotify.

Windows-

use Win32::FileSystem::Watcher; 

my $watcher = Win32::FileSystem::Watcher->new("c:\\"); 

# or 

my $watcher = Win32::FileSystem::Watcher->new(
    "c:\\", 
    notify_filter => FILE_NOTIFY_ALL, 
    watch_sub_tree => 1, 
); 

$watcher->start(); 
print "Monitoring started."; 

sleep(5); 

# Get a list of changes since start(). 
my @entries = $watcher->get_results(); 

# Get a list of changes since the last get_results() 
@entries = $watcher->get_results(); 

# ... repeat as needed ... 

$watcher->stop(); # or undef $watcher 

foreach my $entry (@entries) { 
    print $entry->action_name . " " . $entry->file_name . "\n"; 
} 

# Restart monitoring 

# $watcher->start(); 
# ... 
# $watcher->stop(); 

LINUX

use Linux::Inotify2; 
my $inotify = new Linux::Inotify2(); 

foreach (@ARGV) 
{ 
    $inotify->watch($_, IN_ALL_EVENTS); 
} 

while (1) 
{ 
    # By default this will block until something is read 
    my @events = $inotify->read(); 
    if (scalar(@events)==0) 
    { 
    print "read error: $!"; 
    last; 
    } 

    foreach (@events) 
    { 
    printf "File: %s; Mask: %d\n", $_->fullname, $_->mask; 
    } 
} 
+2

http://search.cpan.org/perldoc?SGI::FAM und http://search.cpan.org/perldoc?Sys::Gamin kann auf Dateisystemen und Unixen arbeiten, wo Inotify dies nicht tut. – ephemient

2

File::Tail die Datei abzufragen, aber einige Vorteile gegenüber Ihrem Ansatz hat:

  • Die Umfrage Zeit neu berechnet dynamisch basierend auf der Nummer der seit der letzten Umfrage geschriebenen Zeilen
  • Wenn die Datei unverändert bleibt, wird die Abfrage verlangsamt, um die CPU nicht zu verbrauchen
  • File :: Tail erkennt, ob die Datei abgeschnitten, verschoben und/oder neu erstellt wurde Öffnen Sie die Datei für Sie
  • Es kann eine reguläre Datei behandeln, die Sie wie gewohnt verwenden können, ohne eine spezielle API oder Syntax.

Beispiel aus der Perldoc:

use File::Tail; 
my $ref=tie *FH,"File::Tail",(name=>$name); 
while (<FH>) { 
    print "$_"; 
} 
Verwandte Themen