【问题标题】:How to read empty file in Perl如何在 Perl 中读取空文件
【发布时间】:2012-02-09 16:21:38
【问题描述】:

我正在使用 readdir 方法将文件列表从目录读取到数组。我可以知道如何读取零大小的文件,因为 readdir 只会读取非零文件。我也想读取空文件(将文件名捕获为存在,即使它是空的)。我可以知道该怎么做吗?以下是我从目录中读取文件的方式:-

opendir (FH, $dirs) || die $! ;
my @lines = readdir (FH) ; 
closedir (FH) ;

提前谢谢你。

【问题讨论】:

  • 您的代码对我来说很好,并且包含空文件的名称。请发布更多关于什么不适合你的信息。
  • “readdir 只会读取非零文件”不是真的。 readdir 将读取所有文件名,无论大小。您可以使用perl -lwe 'opendir F,"." or die $!; while (readdir F) { print unless -s }' 进行尝试,其中unless -s 的意思是“如果大小!= 0”。
  • Re "readdir 只会读取非零文件",readdir 不读取文件,并且它不会根据文件的长度(或任何其他因素)过滤它返回的文件.
  • 您好 Greg Hewgill、TLP 以及所有花时间帮助我解决这个问题的人。我做了一个小脚本来测试readdir,它确实捕获了零内容文件。它能够读取空文件,确实是我的另一部分代码错误:(。对不起,我下次应该更加小心。你们所有人的帮助很大!再次感谢!

标签: perl


【解决方案1】:

首先,您不应该使用裸词目录句柄。第二,-z tells you when a file is empty。像这样的东西应该可以工作:

use strict;
use warnings;

my $dirs="/whatever/dir/you/want";

opendir(my $dh,$dirs) or die $!;

#only grabbing actual files that we can read.
my @files=grep{(-f $_) and (-r $_)} map{"$dirs/$_"} readdir($dh); 

closedir($dh);

foreach my $file(@files)
{
  if(-z $file)
  {
    print "File $file is empty.\n";
  }
  else
  {
    print "File $file is not empty.\n";
  }
}

事实上,正如 TLP 在 cmets 中指出的那样,您可以使用 -s 来获取文件的大小(以字节为单位)。

【讨论】:

  • for my $file (grep -f, readdir $dh) 为您节省了一些打字时间。但我不认为他要求零大小的文件,他认为 readdir 忽略零大小的文件。
  • 没错,这样更紧凑。说实话,在重读这个问题后,我不确定 OP 是否想要保留零大小的文件......
  • readdir 不返回文件路径,只返回文件名。固定的。 (@TLP 的代码也有同样的问题。)
猜你喜欢
  • 2011-01-09
  • 2023-04-03
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多