Comment puis-je vérifier si un fichier existe en Perl?

112

J'ai un chemin relatif

   $base_path = "input/myMock.TGZ";

myMock.TGZest le nom du fichier situé dans le dossier d'entrée. Le nom de fichier peut changer. Mais le chemin est toujours stocké $base_path.

Je dois vérifier si le fichier existe au format $base_path.

superstar
la source

Réponses:

179

Testez si quelque chose existe à un chemin donné à l'aide de l' -eopérateur de test de fichier.

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

Cependant, ce test est probablement plus large que prévu. Le code ci-dessus générera une sortie si un fichier brut existe sur ce chemin, mais il se déclenchera également pour un répertoire, un tube nommé, un lien symbolique ou une possibilité plus exotique. Voir la documentation pour plus de détails.

Compte tenu de l'extension de .TGZdans votre question, il semble que vous attendiez un fichier simple plutôt que des alternatives. L' -fopérateur de test de fichier demande si un chemin conduit à un fichier brut.

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

La documentation perlfunc couvre la longue liste des opérateurs de test de fichiers de Perl qui couvre de nombreuses situations que vous rencontrerez dans la pratique.

  • -r
    Le fichier est lisible par uid / gid effectif.
  • -w
    Le fichier est accessible en écriture par uid / gid effectif.
  • -x
    Le fichier est exécutable par uid / gid effectif.
  • -o
    Le fichier appartient à uid efficace.
  • -R
    Le fichier est lisible par le vrai uid / gid.
  • -W
    Le fichier est accessible en écriture par le vrai uid / gid.
  • -X
    Le fichier est exécutable par uid / gid réel.
  • -O
    Le fichier appartient à uid réel.
  • -e
    Le fichier existe.
  • -z
    Le fichier a une taille nulle (est vide).
  • -s
    Le fichier a une taille différente de zéro (renvoie la taille en octets).
  • -f
    Le fichier est un fichier simple.
  • -d
    Le fichier est un répertoire.
  • -l
    Le fichier est un lien symbolique (faux si les liens symboliques ne sont pas pris en charge par le système de fichiers).
  • -p
    Le fichier est un tube nommé (FIFO) ou Filehandle est un tube.
  • -S
    Le fichier est une socket.
  • -b
    Le fichier est un fichier spécial de bloc.
  • -c
    Le fichier est un fichier spécial de caractère.
  • -t
    Filehandle est ouvert à un tty.
  • -u
    Le fichier a défini le bit setuid.
  • -g
    Le fichier a défini le bit setgid.
  • -k
    Le fichier a un bit collant défini.
  • -T
    Le fichier est un fichier texte ASCII ou UTF-8 (estimation heuristique).
  • -B
    Le fichier est un fichier «binaire» (à l'opposé de -T).
  • -M
    Heure de début du script moins l'heure de modification du fichier, en jours.
  • -A
    Idem pour le temps d'accès.
  • -C
    Idem pour le temps de changement d'inode (Unix, peut différer pour d'autres plates-formes)
Greg Bacon
la source
hey bacon, ravi de vous voir. donc -e fonctionne même pour un chemin relatif? Je pensais que cela ne fonctionnait que pour un fichier particulier ... merci cool
superstar
3
@superstar Bonjour encore! Oui, -efonctionne avec des chemins relatifs, mais je pense que j'ai peut-être mal compris votre question. Avez-vous un répertoire nommé myMock.TGZet vous voulez savoir si ce répertoire contient un fichier avec un nom particulier? Aidez-nous à vous donner de meilleures réponses en modifiant votre question pour inclure des exemples!
Greg Bacon
29

Vous voudrez peut-être une variante de existe ... 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.
hpavc
la source
16
if (-e $base_path)
{ 
 # code
}

-e est l'opérateur «existence» en Perl.

Vous pouvez vérifier les autorisations et autres attributs à l'aide du code sur cette page .

mdm
la source
3
Pourquoi ne pas créer un lien vers la documentation officielle de ces opérateurs?
Ether
@Ether, juste parce que je cherchais l'opérateur d'existence et c'est la première page que j'ai trouvée. PerlDoc était probablement une meilleure option rétrospectivement.
mdm
13

Vous pouvez utiliser: if(-e $base_path)

Klaus Byskov Pedersen
la source
7
Vous pouvez également utiliser -fpour tester un fichier normal (par opposition à un répertoire ou à divers autres types de fichiers spéciaux)
justintime
11

Utilisation:

if (-f $filePath)
{
  # code
}

-erenvoie true même si le fichier est un répertoire. -fne retournera vrai que s'il s'agit d'un fichier réel

Zain Rizvi
la source
5
#!/usr/bin/perl -w

$fileToLocate = '/whatever/path/for/file/you/are/searching/MyFile.txt';
if (-e $fileToLocate) {
    print "File is present";
}
Balaji Boggaram Ramanarayan
la source
5
if(-e $base_path){print "Something";}

ferait l'affaire


la source
1

Utilisez le code ci-dessous. Ici -f vérifie, c'est un fichier ou pas:

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

et apprécie

Nikhil Ranjan
la source