【发布时间】:2011-12-04 23:18:32
【问题描述】:
我知道您可以使用以下方法测试文件是否为目录:
if(-d $filename)
但是如果不是目录,如何测试呢?
【问题讨论】:
-
规范的 Stack Overflow 问题是 How do I distinguish a file from a directory in Perl?。
标签: perl file operators conditional-statements
我知道您可以使用以下方法测试文件是否为目录:
if(-d $filename)
但是如果不是目录,如何测试呢?
【问题讨论】:
标签: perl file operators conditional-statements
您有没有想过尝试以下方法?
if (! -d $filename) ...
-d 的结果毕竟是可以被视为布尔值的东西,因此逻辑非运算符! 可以正常工作。
而且,如果您的目标比“不是目录”更具体,请参阅here。有相当多的东西不是目录,有时将其视为常规文件是没有意义的。
请记住,这是假设您已经验证了文件名存在。如果您对不存在的文件名执行 ! -d,它将返回 true。
你是否认为一个不存在的东西是“不是一个目录”是一个哲学问题,但是,如果你想确保它也存在,你可以将! -d与-e结合使用,喜欢:
if ((-e $filename) && (! -d $filename)) ...
【讨论】:
!-d NO_SUCH_FILE 返回 true)。
要测试某个东西是否是一个文件,而不是一个目录,你需要简单地结合两个测试(没有单一的测试):
if (-e $file && !-d $file) { # a file but not a directory }
请注意:
恕我直言,paxdiablo 的回答对于问题的措辞是错误的(纯!-d 不适用于用户询问的内容,因为它检查随机事物/字符串是否不是目录,不是某物是否是不是目录的文件)。例如。 !-d NO_SUCH_FILE 返回真。
Greg 的回答可能完全正确,具体取决于原始用户是否打算在其“不是目录的文件”的定义中包含非普通文件(例如符号链接、命名管道等)。如果他们打算包含所有这些特殊的“文件”,那么 Greg 的回答也是错误的,因为“-f”将它们排除在外(正如 Greg 首先在他的回答中明智地指出的那样)。
【讨论】:
本着TIMTOWTDI的精神:
unless (-d $filename)
【讨论】:
-f 操作符会测试某个东西是否是“常规文件”。这不包括目录,但也不包括管道和设备节点等内容。
if (-f $filename) { ...
【讨论】: