Estoy escribiendo algunos Perl que toma programas de TV grabados en Windows Media Center y los mueve/cambia el nombre/los elimina dependiendo de ciertos criterios.Determinar si un archivo está en uso en Perl en Windows
Dado que Perl se ejecuta con bastante frecuencia, me gustaría determinar claramente si el archivo está en uso o no (en otras palabras, el programa está en proceso de grabación) para evitar hacer algo con él.
Mi método actual se ve en el estado de un archivo (usando "stat") y lo compara de nuevo después de 5 segundos, así:
sub file_in_use
{
my $file = shift;
my @before = stat($file);
sleep 5;
my @after = stat($file);
return 0 if ($before ~~ $after);
return 1;
}
Parece que funciona, pero soy consciente de que hay es probablemente una forma mejor y más limpia de hacer esto.
¿Puede avisarnos?
Este es un buen approch a la misma y No creo que encuentre muchas opciones alrededor ... otra forma de hacerlo sería leyendo la aplicación pid y mover los archivos una vez que el pid se haya apagado ... – Prix
de Prix (creo que es tan importante señalar out): * Si el archivo se está utilizando a tiempo completo y no se ha liberado, no puede realizar un movimiento [o eliminar] en el archivo, ya que producirá un error ... *. (Una copia puede funcionar dependiendo de las distintas configuraciones de modo de archivo). Incluso con el método stat, debes * todavía * manejar el escenario FS y usar el 'file_in_use' solo como 'pista' (aunque las posibles condiciones de carrera pueden nunca materializarse) aquí). –
@pst Cierto, por eso creo que mover es una buena forma de hacerlo ... ya que si el archivo todavía está bloqueado, devolverá 0 o le dirá un error dependiendo de cómo lo codifique y puede seguir intentándolo hasta se lanza más o menos ... – Prix