在Perl中测试文件是否不是目录

8

我知道您可以使用以下方式测试文件是否是目录:

if(-d $filename)

但如果它不是一个目录,那该怎么测试呢?


2
可能是如何在Perl中区分文件和目录?的重复问题。 - Greg Hewgill
1
标准的Stack Overflow问题是*如何在Perl中区分文件和目录?*。 - Peter Mortensen
4个回答

16

你考虑过尝试以下方法吗?

if (! -d $filename) ...

-d 的结果实际上可以被视为布尔值,因此逻辑非操作符将起作用。

而且,如果你需要比“不是一个目录”更具体的东西,请参见这里。有很多东西并不是目录,有时将其视为常规文件是没有意义的。

请记住,这是在假设您已经验证了文件名是否存在的情况下。如果您对不存在的文件名执行!-d,它将返回true。

这是一个哲学问题,即您是否认为不存在的东西是“不是目录”,但如果您还想确保它存在,可以将!-d-e一起使用,类似于:

if ((-e $filename) && (! -d $filename)) ...

3
我无法在足够快的时间内达到30个字符......我认为这个问题实际上让我震惊了。 - Brian Roach
2
请注意:根据您解析 OP 的需求的方式,此答案可能是错误的。我解析的方式是,他想知道某个东西是否是一个文件,但不是一个目录 - 即使对于一些本来就不是文件的东西(例如 !-d NO_SUCH_FILE 返回 true),这个答案也会返回 true。 - DVK

5
为了测试某个东西是否是文件,但不是目录,你需要简单地组合两个测试(没有单一的测试):
if (-e $file && !-d $file) { # a file but not a directory }

请注意:
  • 恕我直言,paxdiablo的回答对于问题的措辞是错误的(纯粹的!-d不能满足用户所要求的检查文件是否为非目录文件,因为它只会检查一个随机的东西或字符串是否不是目录,例如!-d NO_SUCH_FILE返回真值)。

  • Greg的答案可能是正确的,这完全取决于原始用户是否想在他们对“不是目录的文件”的定义中包括非普通文件(例如符号链接,命名管道等)。如果他们想包括所有这些特殊的“文件”,那么Greg的答案也是错误的,因为“-f”会排除它们(正如Greg在他的答案中明智地指出的那样)。


3

非常优雅 - Pavel

2
-f操作符用于测试某个文件是否为“普通文件”。这将排除目录,但也将排除诸如管道和设备节点等其他文件类型。
if (-f $filename) { ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接