添加更多数据后,为什么我的文件大小相同?

时间:2013-03-25 11:42:32

标签: perl file-io

在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大小吗?我检查了两个文本文件,副本确实有最后的文本。

感谢您的帮助!

5 个答案:

答案 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的代码运行正常。