0

Perl 遇到一些麻烦(我是新手)。我在同一目录中有一个 .txt 文件。我打算复制文件,将其打印到标准输出,在副本中添加更多文本,然后比较文件大小。这是我到目前为止所拥有的:

#!/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 文件大小为 28 MYCOPYFILE 文件大小为 28

由于我添加了额外的文本,MYCOPYFILE 的大小肯定应该大于 MYFILE 的大小吗?我检查了两个文本文件,副本末尾确实有额外的文本。

谢谢你的帮助!

4

5 回答 5

6

您可以使用文件名检查文件的大小(您不必打开它)。

my $size = -s 'data.txt' ;

你应该总是开始你的脚本

use strict ;
use warnings ;

并且打开文件最好使用三参数版本open

open my $filehandle , '<' , 'filename' or die "Failed to open: $!" ;
于 2013-03-25T11:59:56.560 回答
3
$filesize = -s MYFILE;

如上所述, -s 不适用于文件句柄。如果要从文件句柄中获取大小,请使用 stat

$filesize = ((stat(MYFILE))[7]);

有关-s 和朋友的详细信息,请参阅perldoc -f -X ,有关 stat 的详细信息,请参阅perldoc -f stat

于 2013-03-25T12:04:41.667 回答
2

dgw 的回答是正确的。

另一种方法是File::stat用作:

    #!/usr/bin/perl
    use strict;
    use warnings;
    use File::stat;

    my $filesize = stat("test.txt")->size;

    print "Size: $filesize\n";

    exit 0;
于 2013-03-25T12:03:23.673 回答
2

关闭文件后检查文件大小。如果这不会改变文件大小,请尝试添加更多文本,然后大小可能会改变。

问候

于 2013-03-25T11:51:23.403 回答
1

Perl 自动对 IO 对象做一些缓冲操作。调用后内容可能不会立即写入磁盘print FH "blalba"。但是,该-s函数从磁盘读取文件大小。所以当你认为你已经“更新”了文件时,你可能会得到比预期更小的大小。

要获得正确的大小,请将缓冲区中的内容刷新到磁盘,然后使用-s. 请注意,close(FH)将首先自动刷新缓冲区,然后关闭文件句柄。所以你可以把-s操作放在close调用后得到准确的尺寸。

flush()或者,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对文件句柄、目录句柄和表示文件名的表达式进行操作。所以你的代码-s工作正常。

于 2013-03-25T13:56:42.953 回答