Come posso verificare se un file esiste in Perl?


112

Ho un percorso relativo

   $base_path = "input/myMock.TGZ";

myMock.TGZè il nome del file che si trova nella cartella di input. Il nome del file può cambiare. Ma il percorso è sempre memorizzato in $base_path.

Devo controllare se il file esiste in $base_path.

Risposte:


179

Verifica se esiste qualcosa in un determinato percorso utilizzando l' -eoperatore di test dei file.

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

Tuttavia, questo test è probabilmente più ampio di quanto intendi. Il codice sopra genererà un output se esiste un file semplice in quel percorso, ma verrà attivato anche per una directory, una named pipe, un collegamento simbolico o una possibilità più esotica. Vedere la documentazione per i dettagli.

Data l'estensione di .TGZnella tua domanda, sembra che ti aspetti un file semplice piuttosto che le alternative. L' -foperatore di test dei file chiede se un percorso porta a un file semplice.

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

La documentazione di perlfunc copre il lungo elenco di operatori di test di file di Perl che copre molte situazioni che incontrerai nella pratica.

  • -r
    Il file è leggibile da uid / gid effettivi.
  • -w
    Il file è scrivibile tramite uid / gid effettivo.
  • -x
    Il file è eseguibile da uid / gid effettivo.
  • -o
    Il file è di proprietà dell'uid effettivo.
  • -R
    Il file è leggibile da uid / gid reale.
  • -W
    Il file è scrivibile tramite uid / gid reale.
  • -X
    Il file è eseguibile da real uid / gid.
  • -O
    Il file è di proprietà di un vero uid.
  • -e
    Il file esiste.
  • -z
    Il file ha dimensione zero (è vuoto).
  • -s
    Il file ha una dimensione diversa da zero (restituisce la dimensione in byte).
  • -f
    Il file è un file semplice.
  • -d
    Il file è una directory.
  • -l
    Il file è un collegamento simbolico (falso se i collegamenti simbolici non sono supportati dal file system).
  • -p
    File è una pipe con nome (FIFO) o Filehandle è una pipe.
  • -S
    Il file è un socket.
  • -b
    Il file è un file speciale a blocchi.
  • -c
    Il file è un file speciale di caratteri.
  • -t
    Filehandle è aperto a una tty.
  • -u
    Il file ha il bit setuid impostato.
  • -g
    Il file ha il bit setgid impostato.
  • -k
    Il file ha un bit appiccicoso impostato.
  • -T
    Il file è un file di testo ASCII o UTF-8 (ipotesi euristica).
  • -B
    Il file è un file "binario" (l'opposto di -T).
  • -M
    Ora di inizio dello script meno l'ora di modifica del file, in giorni.
  • -A
    Lo stesso per il tempo di accesso.
  • -C
    Lo stesso per il tempo di modifica dell'inode (Unix, può differire per altre piattaforme)

hey bacon, piacere di vederti. quindi -e funziona anche per un percorso relativo? pensavo che funzionasse solo per un file particolare ... fantastico grazie
superstar

3
@superstar Ciao di nuovo! Sì, -efunziona con percorsi relativi, ma penso di aver frainteso la tua domanda. Hai una directory denominata myMock.TGZe vuoi sapere se quella directory contiene un file con un nome particolare? Aiutaci a darti risposte migliori modificando la tua domanda per includere esempi!
Greg Bacon

29

Potresti volere una variante di esistente ... 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
               doesnt 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.

16
if (-e $base_path)
{ 
 # code
}

-e è l'operatore "esistenza" in Perl.

Puoi controllare le autorizzazioni e altri attributi utilizzando il codice in questa pagina .


3
Perché invece non collegarsi alla documentazione ufficiale di questi operatori?
Ether

@Ether, solo perché stavo cercando l'operatore di esistenza ed è la prima pagina che ho trovato. PerlDoc era probabilmente un'opzione migliore in retrospettiva.
mdm

13

Puoi usare: if(-e $base_path)


7
Potresti anche usarlo -fper testare un file normale (al contrario di una directory o di vari altri tipi speciali di file)
justintime

11

Uso:

if (-f $filePath)
{
  # code
}

-erestituisce true anche se il file è una directory. -frestituirà true solo se si tratta di un file effettivo


5
#!/usr/bin/perl -w

$fileToLocate = '/whatever/path/for/file/you/are/searching/MyFile.txt';
if (-e $fileToLocate) {
    print "File is present";
}

5
if(-e $base_path){print "Something";}

farebbe il trucco


1

Usa il codice sottostante. Qui -f controlla, è un file o no:

print "File $base_path is exists!\n" if -f $base_path;

e goditelo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.