2015-11-05 65 views
1

我發現文件Ruby的File.open奇怪的行爲

[3] pry():1> File.zero?(file.path) 
=> true 
[4] pry():1> file.size 
=> 3894 
[5] pry():1> File.zero?(file.path) 
=> false 

真正的文件大小的一個很奇怪的行爲從[3][5]可以通過在bash檢查他們確認。

對此行爲有解釋嗎?有一件事要提前file.class可能是FileTempfile它發生在這兩種情況。

+3

顯示'[1]'和'[2]'中發生了什麼可能會有所幫助。你寫的文件? – cremno

+0

不,我正在檢查路徑 –

+0

有沒有可能是網絡文件服務器的問題? NFS用於在當天做一些奇怪的事情...... –

回答

3

您看到了這個看似怪異行爲的原因是因爲每個File對象都有一個File::Stat object封裝什麼時候採取一些行動時觸發更新時纔會更新文件的常見狀態信息。在這種情況下,觸發器是在文件上調用size。您可以檢查stat對象以查看時間戳。

這裏是與stat通話中拋出一個完全重複的例子。

irb(main):021:0* f = File.new "out", "w" 
    => #<File:out> 
irb(main):022:0> f.write "hi" 
    => 2 
irb(main):023:0> File.zero? f.path 
    => true 
irb(main):024:0> f.stat 
    => #<File::Stat dev=0x801, ino=1062714, mode=0100664, nlink=1, uid=1000, gid=1000, rdev=0x0, size=0, blksize=4096, blocks=0, atime=2015-11-05 15:50:25 -0800, mtime=2015-11-05 15:52:08 -0800, ctime=2015-11-05 15:52:08 -0800> 
irb(main):025:0> f.size # triggers an update 
    => 2 
irb(main):026:0> File.zero? f.path 
    => false 
irb(main):027:0> f.stat 
    => #<File::Stat dev=0x801, ino=1062714, mode=0100664, nlink=1, uid=1000, gid=1000, rdev=0x0, size=2, blksize=4096, blocks=8, atime=2015-11-05 15:52:47 -0800, mtime=2015-11-05 15:52:45 -0800, ctime=2015-11-05 15:52:45 -0800> 

雖然,我想一個File對象上調用write應觸發更新。

編輯:我想出了爲什麼write不會觸發更新。 writeFile的父類(IO)的一種方法。但是sizestat都是File的方法。因此,必須在File中實施write方法以獲得(或知曉)stat。我懷疑在File中實施的方法的任何調用將更新stat

+0

謝謝你清理這個! –