有没有办法用Perl程序检查一个文件是否是空文件?

zengzsys  于 2023-01-05  发布在  Perl
关注(0)|答案(2)|浏览(377)

我正在寻找一个小脚本,它会告诉我一个文件是否是空文件,但我无法显示这一点。
我使用了下面的代码:

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

这里我无法打印“这是一个空文件”,而且我的代码没有进入if循环。有人能告诉我上面的代码出了什么问题吗?

6jygbczu

6jygbczu1#

相关的file test operators为:

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

您正在检查$dir是否为非空,因此与您尝试实现的相反。请使用-z(或!-s)代替。
此外,每个$dir只是文件名,没有路径,因此如果不处理当前目录,则需要自己包含它。

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

z9gpfhce2#

主要的问题是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";
}

同样值得注意的是,使用bareword目录句柄并不是一个好主意,使用词法变量作为句柄要好得多,我将这样编写代码:

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好得多的名字:-)

相关问题