2012-05-30 20 views
6

Dado el nombre de un archivo, ¿cómo puedo determinar si el archivo está actualmente abierto o en uso? (Estoy hablando de archivos en lugar de identificadores de archivos Perl.)¿Cómo verifica si un archivo está abierto usando Perl?

Tenga en cuenta que estoy buscando una solución de Perl de propósito general en lugar de una específica de sistema operativo. Como mínimo, me gustaría algo que funcione tanto en Windows como en sistemas basados ​​en GNU/Linux.

+0

Duplicado de http://stackoverflow.com/questions/520196/how-can-i-check-if-a-filehandle-is-open-in-perl – cppcoder

+0

@cppcoder: La pregunta a la que se refiere parece ser sobre los manejadores de archivo abiertos. Estoy hablando de archivos en esta pregunta. – Sam

+0

POSIX no proporciona ninguna forma de hacerlo. Por lo tanto, no es posible una solución portátil dada la interfaz O/S portátil actual disponible. Tendría que crear un enfoque de nivel superior que proporcione un único punto de acceso para los bits de apertura. Es como con los archivos de bloqueo. – tchrist

Respuesta

3

POSIX no proporciona ninguna manera de hacer esto. Por lo tanto, no es posible una solución portátil dada la interfaz O/S portátil actual disponible.

Debería crear un enfoque de nivel superior que proporcione un único punto de acceso para los bits de apertura. Es como con los archivos de bloqueo.

1

Véase el siguiente fragmento (sólo Linux/Unix, no nos dice qué sistema operativo se ejecuta):

En una sola línea:

perl -e 'my $file = $ARGV[0]; print "file $file is opened" if `lsof $file`;' FILE 

En una secuencia de comandos:

#!/usr/bin/env perl -w 

use strict; 

my $file = $ARGV[0]; 
print "file $file is opened\n" if `lsof $file`; 

Para ejecutarlo:

./script.pl FILENAME 
+0

Esa es probablemente una buena manera de hacerlo en un sistema basado en Unix. Sin embargo, estoy usando Windows. Una solución de propósito general que no dependa del sistema operativo sería buena. – Sam

+0

Hay un módulo perl: http://search.cpan.org/~marcb/Unix-Lsof-0.0.9/lib/Unix/Lsof.pm, pero funciona solo en los gustos de Unix y Unix. Tal vez trabajar con 'cygwin' puede ayudar allí. –

+0

También hay http://search.cpan.org/~rjbs/perl-5.16.0/ext/Fcntl/Fcntl.pm – flesk

0

Pruebe Scalar::Util

El módulo Scalar::Util proporciona la función openhandle() para esto. A diferencia de fileno(), maneja los manejadores de archivos perl que no están asociados con las manetas de archivo del sistema operativo. A diferencia de tell(), que no produce advertencias cuando se utiliza en un gestor de archivo sin abrir De documentation del módulo:

openhandle FH

Returns FH if FH may be used as a filehandle and is open, or FH is a tied handle. Otherwise "undef" is returned. 

    $fh = openhandle(*STDIN);   # \*STDIN 
    $fh = openhandle(\*STDIN);   # \*STDIN 
    $fh = openhandle(*NOTOPEN);   # undef 
    $fh = openhandle("scalar");   # undef 
+0

Eché un vistazo a esa función, pero no parece abordar la pregunta. Sin embargo, es posible que simplemente no sepa cómo usar la función para hacer lo que estoy pidiendo. – Sam

+0

Sí, lo siento, respuesta incorrecta. Supongo que tendrás que buscar las funciones de apertura de archivos específicas de Windows desde la API de Win32. – Sly

0

Prueba este

use strict; 
open(IN, ">test"); 
print IN "Hello"; 
close(IN); 
if(fileno(IN) == undef) 
{ 
    print "File is CLOSED\n"; 
} 
+0

Pregunto por archivos en lugar de identificadores de archivos. – Sam

-1

Te doy cuenta de Don 't quiere abrir el identificador de archivo, pero es probablemente el método más simple de la OMI:

open my $myfh, '<', $my_file or die "Couldn't open $my_file: $!"; 
+0

Creo que normalmente puede abrir archivos en modo de lectura, incluso si ya están abiertos en otro lugar. – Sam

0

Sé que ha pasado un tiempo, pero para Windows he tenido bastante buena suerte al detectar que se está escribiendo un archivo al intentar bloquear el archivo (nada sofisticado, solo abrir para leer, usar el rebaño interno de Perl y cerrar el archivo). esto parece funcionar incluso en archivos de red. No estoy seguro de si esto funciona para Linux (podría ser en una escritura) y no sé si puede detectar otros lectores de archivos.

Cuestiones relacionadas