如何检查Perl中是否存在文件?

时间:2010-04-08 15:09:10

标签: perl

我有一个相对路径

   $base_path = "input/myMock.TGZ";

myMock.TGZ是位于输入文件夹中的文件名。 文件名可以更改。但路径始终存储在$base_path

我需要检查$base_path中是否存在该文件。

8 个答案:

答案 0 :(得分:163)

使用-e文件测试运算符测试给定路径中是​​否存在某些

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

但是,这个测试可能比您想要的更广泛。如果该路径中存在普通文件,则上面的代码将生成输出,但它也将触发目录,命名管道,符号链接或更奇特的可能性。 See the documentation了解详情。

鉴于您的问题中.TGZ的扩展,您似乎期望普通文件而不是替代品。 -f文件测试运算符询问路径是否指向普通文件。

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

perlfunc文档涵盖Perl's file-test operators的长列表,其中涵盖了您在实践中将遇到的许多情况。

  
      
  • -r
      文件可由有效的uid / gid读取。
  •   
  • -w
      文件可由有效的uid / gid写入。
  •   
  • -x
      文件可由有效的uid / gid执行。
  •   
  • -o
      文件归有效的uid所有。
  •   
  • -R
      文件可由real uid / gid读取。
  •   
  • -W
      文件可由real uid / gid写入。
  •   
  • -X
      文件可由real uid / gid执行。
  •   
  • -O
      文件由real uid拥有。
  •   
  • -e
      文件存在。
  •   
  • -z
      文件大小为零(为空)。
  •   
  • -s
      文件具有非零大小(以字节为单位返回大小)。
  •   
  • -f
      文件是普通文件。
  •   
  • -d
      文件是一个目录。
  •   
  • -l
      文件是符号链接(如果文件系统不支持符号链接,则为false)。
  •   
  • -p
      File是命名管道(FIFO),或Filehandle是管道。
  •   
  • -S
      文件是一个插座。
  •   
  • -b
      文件是块特殊文件。
  •   
  • -c
      文件是一个字符特殊文件。
  •   
  • -t
      Filehandle打开了tty。
  •   
  • -u
      文件已设置setuid位。
  •   
  • -g
      文件已设置setgid位。
  •   
  • -k
      文件已设置粘滞位。
  •   
  • -T
      文件是ASCII或UTF-8文本文件(启发式猜测)。
  •   
  • -B
      文件是“二进制”文件(与-T相反)。
  •   
  • -M
      脚本开始时间减去文件修改时间,以天为单位。
  •   
  • -A
      访问时间相同。
  •   
  • -C
      同样的inode更改时间(Unix,可能因其他平台而异)
  •   

答案 1 :(得分:29)

你可能想要一个存在的变体... 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.

答案 2 :(得分:14)

if (-e $base_path)
{ 
 # code
}

-e是Perl中的“存在”运算符。

您可以使用this page上的代码检查权限和其他属性。

答案 3 :(得分:13)

您可以使用:if(-e $base_path)

答案 4 :(得分:10)

使用:

if (-f $filePath)
{
  # code
}
即使文件是目录,

-e也会返回true。如果-f是实际文件,则{{1}}只会返回true

答案 5 :(得分:5)

#!/usr/bin/perl -w

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

答案 6 :(得分:5)

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

会做的伎俩

答案 7 :(得分:1)

使用以下代码。这里-f检查,它是不是文件:

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

并享受