在Perl上遇到一些麻烦(我是全新的)。我在同一目录中有一个.txt文件。我打算复制文件,将其打印到stdout,向副本添加更多文本,并比较文件大小。这就是我到目前为止所做的:
#!/usr/local/bin/perl
use File::Copy;
copy("data.txt", "copyOfData.txt") or die "copy failed :(";
open (MYFILE, "data.txt") or die "open failed :(";
while (<MYFILE>) {
chomp;
print "$_\n";
}
$filesize = -s MYFILE;
print "MYFILE filesize is $filesize\n";
close (MYFILE);
open(MYCOPYFILE, ">>copyOfData.txt");
print MYCOPYFILE "\nextra data here blah blah blah\n";
$filesize = -s MYCOPYFILE;
print "MYCOPYFILE filesize is $filesize\n";
close (MYCOPYFILE);
但是,我得到的输出如下:
MYFILE filesize是28 MYCOPYFILE文件大小为28
当我添加了额外的文字时,MYCOPYFILE大小肯定应该大于MYFILE大小吗?我检查了两个文本文件,副本确实有最后的文本。
感谢您的帮助!
答案 0 :(得分:6)
您可以使用文件名检查文件的大小(您不必打开它)。
my $size = -s 'data.txt' ;
您应该始终使用
启动脚本use strict ;
use warnings ;
使用open
open my $filehandle , '<' , 'filename' or die "Failed to open: $!" ;
答案 1 :(得分:3)
$filesize = -s MYFILE;
如上所述,-s不适用于文件句柄。如果要从文件句柄中获取大小,请使用stat
$filesize = ((stat(MYFILE))[7]);
有关-s和好友的详细信息,请参阅 perldoc -f -X ,有关统计信息,请参阅 perldoc -f stat
答案 2 :(得分:2)
关闭文件后检查filesize。 如果这没有改变文件大小尝试添加更多文本,那么大小可能会随之改变。
问候
答案 3 :(得分:2)
dgw's answer是正确的。
另一种方法是使用File::stat
:
#!/usr/bin/perl
use strict;
use warnings;
use File::stat;
my $filesize = stat("test.txt")->size;
print "Size: $filesize\n";
exit 0;
答案 4 :(得分:1)
Perl会自动对IO对象执行一些缓冲操作。致电print FH "blalba"
后,内容可能无法立即写入磁盘。但是,-s
函数从磁盘读取文件大小。因此,当您认为已“更新”文件时,您可能会得到比预期更小的尺寸。
要获得正确的大小,请将缓冲区中的内容刷新到磁盘,然后使用-s
获取大小。请注意close(FH)
将首先自动刷新缓冲区,然后关闭文件句柄。因此,您可以在-s
调用之后执行close
操作,以获得准确的大小。
或者,在获得大小之前,通过调用flush()
的{{1}}来明确刷新缓冲区:
IO::Handle
open(MYCOPYFILE, ">>copyOfData.txt");
print MYCOPYFILE "\nextra data here blah blah blah\n";
MYCOPYFILE->flush();
$filesize = -s MYCOPYFILE;
print "MYCOPYFILE filesize is $filesize\n";
对文件句柄,目录句柄和表示文件名的表达式进行操作。因此,关于-s
的代码运行正常。