2010-03-02 6 views
5

मैं सोच रहा था कि फ़ाइल को अपडेट करने का इंतजार करने का कोई तरीका है या नहीं, और उसके बाद अपडेट होने के बाद इसे पढ़ें। तो अगर मेरे पास file.txt है, तो मैं प्रतीक्षा करना चाहता हूं जब तक कि कुछ नया लिखा न जाए, और फिर इसे पढ़ें/इसे संसाधित करें/आदि। वर्तमान में मैं Time::HiRes::sleep(.01) का उपयोग कर मतदान कर रहा हूं, लेकिन मुझे आश्चर्य है कि क्या कोई बेहतर तरीका है। धन्यवाद।फ़ाइल अपडेट होने तक प्रतीक्षा करने का एक अच्छा तरीका क्या है और फिर पर्ल में इसे पढ़ा जाता है?

उत्तर

9

हां एक बेहतर तरीका है। विंडोज़ पर आप लिनक्स पर FileSystemWatcher इंटरफ़ेस का उपयोग कर सकते हैं, inotify का उपयोग करें।

विंडोज

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(); 

लिनक्स

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 और http://search.cpan.org/perldoc?Sys::Gamin फाइल सिस्टम और यूनिक्स पर काम कर सकते हैं जहां inotify नहीं करता है। – ephemient

2

File::Tail फ़ाइल मतदान होगा, लेकिन अपने दृष्टिकोण के ऊपर कुछ लाभ हैं:

  • चुनाव समय पुनः गणना की है गतिशील रूप से संख्या के आधार पर अंतिम मतदान
  • यदि फ़ाइल अपरिवर्तित बनी हुई है, तो मतदान सीपीयू
  • फ़ाइल :: टेल का पता लगाएगा कि फ़ाइल काटा गया है, स्थानांतरित किया गया है और/या फिर से बनाया गया है, और चुपचाप पुनः- आपके लिए फ़ाइल खोलें
  • यह एक नियमित फ़ाइल हैंडल बांध सकता है जिसे आप बिना किसी विशेष एपीआई या वाक्यविन्यास के सामान्य उपयोग कर सकते हैं। perldoc से

उदाहरण:

use File::Tail; 
my $ref=tie *FH,"File::Tail",(name=>$name); 
while (<FH>) { 
    print "$_"; 
} 
संबंधित मुद्दे