it-swarm.com.de

Wie kann ich überprüfen, ob ein Dateihandle in Perl geöffnet ist?

Gibt es eine Möglichkeit zu überprüfen, ob eine Datei bereits in Perl geöffnet ist? Ich möchte einen Lesezugriff auf Dateien haben, daher ist flock nicht erforderlich.

 open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
 #  or something like
 close(FH) if (<FILE_IS_OPEN>);
31
matt

Bitte sehen Sie die Antwort zu openhandle() aus Scalar::Util Die Antwort, die ich hier ursprünglich geschrieben habe, war einmal das Beste, was wir tun konnten, aber es ist jetzt sehr veraltet.

38
chaos

Das Modul Scalar :: Util stellt hierfür die Funktion openhandle() zur Verfügung. Im Gegensatz zu fileno () handelt es sich um Perl-Dateihandles, die nicht mit OS-Dateihandles verknüpft sind. Im Gegensatz zu tell () werden bei Verwendung eines ungeöffneten Dateihandles keine Warnungen ausgegeben. Aus der documentation des Moduls

handgriff 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
22
brady

Warum möchtest du das tun? Der einzige Grund, den ich mir vorstellen kann, ist, wenn Sie alte Paket-Handles verwenden (was Sie scheinbar tun) und verhindern möchten, dass versehentlich ein Griff über einem anderen gespeichert wird.

Dieses Problem kann durch Verwendung neuer indirekter Dateihandles gelöst werden.

open my $fh, '<', $filename or die "Couldn't open $filename: $!";
12
Leon Timmermans

Für genau diesen Zweck stellt Perl die Funktion fileno zur Verfügung.

EDIT Ich stehe im Hinblick auf fileno() korrigiert. Ich bevorzuge den kürzeren Test

fileno FILEHANDLE

Über

tell FH != -1

8
converter42

Tell erzeugt eine Warnung (Stat, -s, -e usw.) mit use warnings (-w)

Perl -wle '
    open my $fh, "<", "notexists.txt"; 
    print "can stat fh" if tell $fh
'
tell() on closed filehandle $fh at -e line 1.
-1

Die Alternativen fileno($fh) und eof($fh) erzeugen keine Warnungen. Die beste Alternative war, die Ausgabe von open zu speichern.

1
CoffeeMonster

Warum interessiert es Sie, wenn es bereits geöffnet ist? Versuchen Sie, gleichzeitige Lesevorgänge abzufangen?

Sie müssen sich nicht wirklich darum kümmern, die Datei zu schließen. Entweder ist es nicht geöffnet und das Schließen schlägt fehl, weil es nichts zu schließen hat, oder die Datei ist geöffnet und das Schließen gibt sie frei. In beiden Fällen ist die Datei in diesem Dateihandle nicht geöffnet. Schließen Sie einfach den Feilengriff, ohne sich darum zu kümmern, wenn er nicht geöffnet ist. Sehen Sie dort etwas Seltsames?

0
brian d foy