我正在寻找一个小脚本,它将告诉我文件是否为空文件,但我无法显示它。
我使用了以下代码:
opendir DIR,$directory ;
while (my $dir =readdir DIR) {
if (-s "$dir") {
print "This is an empty file";
}
}
在这里,我无法打印“这是一个空文件”,并且我的代码没有进入if循环内。谁能告诉我以上代码有什么问题
答案 0 :(得分:7)
相关的file test operators是:
您正在检查$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
好得多:-)