Me preguntaba si hay alguna manera de esperar a que se actualice un archivo, y luego leer de él una vez que se haya actualizado. Entonces, si tengo file.txt
, quiero esperar hasta que se escriba algo nuevo y luego leerlo/procesarlo/etc. Actualmente estoy sondeando usando Time::HiRes::sleep(.01)
, pero me pregunto si hay una mejor manera. Gracias.¿Cuál es una buena manera de esperar hasta que se actualice un archivo y luego leerlo en Perl?
5
A
Respuesta
9
Sí, hay una mejor manera. En Windows puede usar la interfaz FileSystemWatcher, en Linux, use inotify.
de 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 sondeará el archivo, pero tiene algunas ventajas sobre el enfoque:
- se vuelve a calcular el tiempo de sondeo dinámicamente basado en el número de líneas escritas desde la última encuesta
- Si el archivo permanece sin cambios, el sondeo se ralentizará para evitar el uso de la CPU
- File :: Tail detectará si el archivo ha sido truncado, movido y/o recreado y silenciosamente abra el archivo para usted
- Puede atar un controlador de archivo regular que puede usar como lo normal sin ninguna API o sintaxis especial.
Ejemplo de la perldoc:
use File::Tail;
my $ref=tie *FH,"File::Tail",(name=>$name);
while (<FH>) {
print "$_";
}
Cuestiones relacionadas
- 1. jQuery Añadir archivo CSS y esperar hasta que se cargue?
- 2. manera más fácil de abrir un archivo de texto y leerlo en una matriz con Perl
- 3. La página no se muestra correctamente hasta que se actualice
- 4. ¿Cuál es una buena manera de probar un archivo para ver si es un archivo zip?
- 5. Cómo esperar hasta que se cierre el archivo
- 6. ¿Esperar hasta que una condición sea verdadera?
- 7. ¿Cuál es una buena manera de refactorizar un módulo monstruo de Perl en submódulos?
- 8. ¿Cuál es una buena forma de implementar una aplicación Perl?
- 9. ¿Cuál es una buena manera de construir un proyecto Backbone.js?
- 10. esperar hasta que un proceso termina
- 11. ¿Cuál es una buena manera de * temporalmente * ordenar un vector?
- 12. Bien y forma limpia que esperar hasta que el archivo se cierra
- 13. Engendrar varios subprocesos para el trabajo y luego esperar hasta que todos terminen
- 14. X11: ¿esperar hasta que se vea una ventana?
- 15. Cómo seguir buscando un archivo hasta que exista, luego proporcione un enlace
- 16. Android Animation: ¿esperar hasta que termine?
- 17. JOptionPane.showMessageDialog ¿esperar hasta que se haga clic en Aceptar?
- 18. ¿Cuál es la mejor manera de abrir y leer un archivo en Perl?
- 19. Cómo forzar a un programa a esperar hasta que se complete una solicitud HTTP en JavaScript?
- 20. ¿Cuál es una buena manera de volcar un archivo central de Linux desde dentro de un proceso?
- 21. ¿Cuál es una buena manera de representar las fuentes delineadas?
- 22. ¿Cuál es la mejor manera de asegurarse de que solo se esté ejecutando una instancia de un programa Perl?
- 23. ¿Puede una secuencia de comandos bash ejecutar comandos simultáneos y luego esperar a que se completen?
- 24. ¿Cómo esperar a que se copie por completo un archivo?
- 25. manera más rápida de ejecutar dos tareas de forma asíncrona y esperar hasta que terminan
- 26. ¿Cuál es una buena manera pitonica de encontrar objetos duplicados?
- 27. ¿Cuál es una buena manera de procesar archivos RTF-codificados y convertirlos a XML?
- 28. ¿Cómo esperar hasta que exista un elemento para dojo?
- 29. ¿Cuál es una buena manera de verificar si un doble es un número entero en C#?
- 30. cuál es una buena manera de eliminar los últimos directorios
http://search.cpan.org/perldoc?SGI::FAM y http://search.cpan.org/perldoc?Sys::Gamin puede funcionar en sistemas de archivos y UNIXes donde inotify no lo hace. – ephemient