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?
5
A
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
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
- 1. warten bis Seite aktualisiert
- 2. Was ist ein einfacher Weg, auf Tastendruck in Haskell zu warten und dann zu erkennen?
- 3. Warten, bis glutPostRedisplay() aktualisiert
- 4. Was ist der beste Weg zu warten, bis eine Animation in MVVM fertig ist?
- 5. richtiger Weg ein Perl globalen Variable aktualisiert
- 6. Was ist ein guter Weg, um mit Perl Entwicklungs/Produktions-Pfade zu verwalten?
- 7. Was ist ein guter Weg, Fehler und Erfolg Nachrichten und Codes zu verwalten?
- 8. Warten bis ein SwingWorker fertig ist?
- 9. Was ist ein PHP-Framework und was ist ein guter?
- 10. Was ist ein guter Faxserver?
- 11. Was ist ein guter Geschwindigkeitsbegrenzungsalgorithmus?
- 12. Warten bis die letzte Funktion beendet ist, dann in angularjs
- 13. Was ist ein guter und funktioneller Weg, um Sammlungselemente in Scala zu tauschen?
- 14. Warten bis Datei vollständig geschrieben ist
- 15. Was ist ein guter Weg, um relative Pfade in Google App Engine zu finden?
- 16. Wie warten, bis ein Animator fertig ist?
- 17. Was ist ein guter Weg, um eine Klasse unserialisierbar zu machen?
- 18. Was ist der richtige Weg, auf Verbindungen zu warten?
- 19. Warten, bis System.Diagnostics.Process.Start fertig ist
- 20. Was ist ein guter Weg, um einen Dart Wrapper für eine JavaScript API zu erstellen?
- 21. warten, bis ein Jenkins Build abgeschlossen ist
- 22. jquery: warten, bis alle Ajax-Aufrufe dann
- 23. Wie warten, bis ein ThreadPoolExecutor fertig ist
- 24. Gibt es einen einfachen Weg in Python zu warten, bis eine bestimmte Bedingung erfüllt ist?
- 25. Warten Sie, bis ein Skript heruntergeladen und ausgeführt wurde und warten Sie, bis DOM geladen wird
- 26. Was ist ein guter Weg, um INotifyPropertyChanged-Ereignisse durch ViewModel-Eigenschaften mit MVVM zu blasen?
- 27. Was ist der beste Weg, Ausnahmen in Perl zu behandeln?
- 28. Was ist ein guter Weg, um sich von einem Fehler fread() zu erholen?
- 29. Was ist ein guter Robotik-Simulator?
- 30. Was ist ein guter Ansatz, um OpenGLES 2.0 zu studieren?
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