125 Stimmen

Wie kann ich in Perl prüfen, ob eine Datei existiert?

Ich habe einen relativen Pfad

   $base_path = "input/myMock.TGZ";

myMock.TGZ ist der Dateiname, der sich im Eingabeordner befindet. Der Dateiname kann sich ändern. Aber der Pfad wird immer in $base_path .

Ich muss prüfen, ob die Datei in $base_path .

200voto

Greg Bacon Punkte 127209

Prüfen Sie, ob etwas unter dem angegebenen Pfad existiert, indem die -e file-test operator.

print "$base_path exists!\n" if -e $base_path;

Dieser Test ist jedoch wahrscheinlich weiter gefasst als Sie beabsichtigen. Der obige Code wird eine Ausgabe erzeugen, wenn eine einfache Datei unter diesem Pfad existiert, aber er wird auch bei einem Verzeichnis, einer benannten Pipe, einem Symlink oder einer exotischeren Möglichkeit funktionieren. Siehe die Dokumentation für Details.

Angesichts der Erweiterung der .TGZ In Ihrer Frage scheint es, dass Sie eine einfache Datei und nicht die Alternativen. Die -f file-test operator fragt, ob ein Pfad zu einer einfachen Datei führt.

print "$base_path is a plain file!\n" if -f $base_path;

Die perlfunc-Dokumentation enthält eine lange Liste von Perl's Datei-Test Operatoren das viele Situationen abdeckt, denen Sie in der Praxis begegnen werden.

  • -r
    Die Datei ist für die effektive uid/gid lesbar.
  • -w
    Datei ist mit effektiver uid/gid beschreibbar.
  • -x
    Die Datei ist mit der effektiven uid/gid ausführbar.
  • -o
    Die Datei gehört der effektiven uid.
  • -R
    Die Datei ist mit der echten uid/gid lesbar.
  • -W
    Die Datei ist mit der echten uid/gid beschreibbar.
  • -X
    Datei ist mit echter uid/gid ausführbar.
  • -O
    Die Datei gehört einer echten uid.
  • -e
    Datei existiert.
  • -z
    Die Datei hat keine Größe (ist leer).
  • -s
    Datei hat eine Größe ungleich Null (gibt Größe in Bytes zurück).
  • -f
    Datei ist eine einfache Datei.
  • -d
    Datei ist ein Verzeichnis.
  • -l
    Datei ist ein symbolischer Link (false, wenn Symlinks vom Dateisystem nicht unterstützt werden).
  • -p
    File ist eine benannte Pipe (FIFO), oder Filehandle ist eine Pipe.
  • -S
    Datei ist ein Socket.
  • -b
    Datei ist eine spezielle Blockdatei.
  • -c
    Datei ist eine spezielle Zeichendatei.
  • -t
    Filehandle wird auf einem tty geöffnet.
  • -u
    Datei hat Setuid-Bit gesetzt.
  • -g
    Datei hat setgid-Bit gesetzt.
  • -k
    Datei hat Sticky-Bit gesetzt.
  • -T
    Datei ist eine ASCII- oder UTF-8-Textdatei (heuristische Schätzung).
  • -B
    Datei ist eine "binäre" Datei (Gegenteil von -T ).
  • -M
    Startzeit des Skripts minus Änderungszeit der Datei, in Tagen.
  • -A
    Dasselbe gilt für die Zugriffszeit.
  • -C
    Dasselbe gilt für die Inode-Änderungszeit (Unix, kann bei anderen Plattformen abweichen)

30voto

hpavc Punkte 1326

Vielleicht möchten Sie eine Variante von exists ... perldoc -f "-f"

      -X FILEHANDLE
       -X EXPR
       -X DIRHANDLE
       -X      A file test, where X is one of the letters listed below.  This unary operator takes one argument,
               either a filename, a filehandle, or a dirhandle, and tests the associated file to see if something is
               true about it.  If the argument is omitted, tests $_, except for "-t", which tests STDIN.  Unless
               otherwise documented, it returns 1 for true and '' for false, or the undefined value if the file
               doesn’t exist.  Despite the funny names, precedence is the same as any other named unary operator.
               The operator may be any of:

                   -r  File is readable by effective uid/gid.
                   -w  File is writable by effective uid/gid.
                   -x  File is executable by effective uid/gid.
                   -o  File is owned by effective uid.

                   -R  File is readable by real uid/gid.
                   -W  File is writable by real uid/gid.
                   -X  File is executable by real uid/gid.
                   -O  File is owned by real uid.

                   -e  File exists.
                   -z  File has zero size (is empty).
                   -s  File has nonzero size (returns size in bytes).

                   -f  File is a plain file.
                   -d  File is a directory.
                   -l  File is a symbolic link.
                   -p  File is a named pipe (FIFO), or Filehandle is a pipe.
                   -S  File is a socket.
                   -b  File is a block special file.
                   -c  File is a character special file.
                   -t  Filehandle is opened to a tty.

                   -u  File has setuid bit set.
                   -g  File has setgid bit set.
                   -k  File has sticky bit set.

                   -T  File is an ASCII text file (heuristic guess).
                   -B  File is a "binary" file (opposite of -T).

                   -M  Script start time minus file modification time, in days.

22voto

mdm Punkte 12210
if (-e $base_path)
{ 
 # code
}

-e ist der 'Existenz'-Operator in Perl.

Sie können die Berechtigungen und andere Attribute mit dem Code auf diese Seite .

16voto

Zain Rizvi Punkte 22533

Verwendung:

if (-f $filePath)
{
  # code
}

-e gibt true zurück, auch wenn die Datei ein Verzeichnis ist. -f gibt nur true zurück, wenn es sich um eine tatsächliche Datei handelt

14voto

Klaus Byskov Pedersen Punkte 111081

Sie können verwenden: if(-e $base_path)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X