2013-03-25 57 views
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

關閉文件,然後檢查大小。哦,是的,當需要保持文件句柄打開時,刷新輸出文件緩衝區。 – SparKot 2013-03-25 11:44:59

回答

1

Perl會自動對IO對象執行一些緩衝操作。在您致電print FH "blalba"後,內容可能無法寫入磁盤。但是,-s函數從磁盤讀取文件大小。所以,當你認爲你已經「更新」了文件,你可能會得到比預期更小的尺寸。

要獲得正確的大小,請將緩衝區中的內容清空到磁盤,然後使用-s獲取大小。請注意,close(FH)將首先自動刷新緩衝區,然後關閉文件句柄。因此,您可以在調用close之後放置-s操作以獲得準確的大小。

或者明確獲得大小之前調用的IO::Handleflush()刷新緩衝區:

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的代碼工作正常。

+0

真的很有幫助 - 謝謝! – jellier 2013-03-25 14:17:24

+0

關閉文件也會刷新緩衝區。因此在檢查文件大小之前關閉文件。 – runrig 2013-03-25 19:16:45

+0

您應該使用3參數打開。 – 2013-04-23 15:56:59

2

關閉文件後檢查文件大小。 如果這不會更改文件大小,請嘗試添加更多文本,然後可能會更改大小。

問候

6

您可以檢查使用的文件名(你不必打開它)的文件的大小。

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

你應該總是與

use strict ; 
use warnings ; 

和打開文件啓動腳本更好的open

open my $filehandle , '<' , 'filename' or die "Failed to open: $!" ; 
+0

感謝您的提示 - 我最終使用stat,但一定會牢記這一點。謝謝。 – jellier 2013-03-25 14:15:42

1

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; 
2
$filesize = -s MYFILE; 

正如上文指出,-s不會在文件句柄工作。如果你想從一個文件句柄大小,使用統計

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

的perldoc -f -X爲-s和朋友的詳細信息,請參閱的perldoc -f統計的統計

+0

這個作品 - 謝謝! Stat還有許多我不知道的其他便利功能 - 歡呼聲。 – jellier 2013-03-25 14:15:04

相關問題