有什么方法可以使用PERL程序检查文件是否为空文件?

时间:2019-06-18 11:26:09

标签: perl

我正在寻找一个小脚本,它将告诉我文件是否为空文件,但我无法显示它。

我使用了以下代码:

opendir DIR,$directory ;
while (my $dir =readdir DIR) {
    if (-s "$dir") {
    print "This is an empty file";
    }
}

在这里,我无法打印“这是一个空文件”,并且我的代码没有进入if循环内。谁能告诉我以上代码有什么问题

2 个答案:

答案 0 :(得分:7)

相关的file test operators是:

  • -z:检查文件是否为空。
  • -s:检查文件大小是否为非零(返回大小以字节为单位)。

您正在检查$dir是否为非空,因此与您要实现的目标相反。改用-z(或!-s)。

另外,每个$dir只是不带路径的文件名,因此,如果不处理当前目录,则需要自己包括它。

if (-z "$directory/$dir") {
    print "This is an empty file";
}

答案 1 :(得分:1)

您的主要问题是readdir()不会返回您认为的结果。它返回目录中文件的名称。但是,返回的名称没有附加目录路径。 -s运算符需要文件的完整路径才能找到它。

因此,您需要自己附加目录名称。这样的事情会起作用:

opendir DIR, $directory ;
while (my $dir = readdir DIR) {
    # Note: Full path here.
    if (-s "$directory/$dir") {
        print "This is an empty file";
    } 
}

但是我还要修复其他几件事。首先-s返回文件的大小。因此,对于非空文件来说确实如此。这意味着您的逻辑是相反的。实际上需要这样:

if (-s "$directory/$dir") {
    print "This is a non-empty file";
} else {
    print "This is an empty file";
}

值得注意的是,使用裸字目录句柄不是一个好主意。最好使用词法变量作为句柄。我会这样写你的代码:

opendir my $dir_h, $directory ;
while (my $file = readdir $dir_h) {
    # Note: Full path here.
    if (-s "$directory/$file") {
        print "This is a non-empty file";
    } else {
        print "This is an empty file";
    } 
}

哦,我还偷偷地更改了变量名。 $file似乎比$dir好得多:-)