2010-03-06 82 views
1

我正在開發一款應用程序,用於將視頻發送到下拉框中。因爲視頻可能需要幾分鐘到幾個小時才能發送到保管箱,所以我想確保文件在我的應用程序開始處理之前完成寫入。Ruby File.size?似乎緩存文件大小

我認爲最簡單的方法是檢查文件的大小,每次通過守護進程索引dropbox。如果文件大小在兩次或更多遍中保持不變,則應用程序可以假定該文件已完成寫入。

但是,當我在我的應用程序的Rails控制檯中混淆了這一點時,它似乎正在緩存文件大小。當我將視頻文件導出到投遞箱目錄時,我會看到這一點。在OS X 10.6查找程序中,文件大小會隨着視頻的寫入而不斷更新。如果我運行File.size?在寫入的文件上,我會重複獲得相同的大小,直到它隨機更新。下面是一些示例輸出,我正在運行File.size?方法每秒一次。

有什麼我失蹤了嗎?

謝謝。

File.size?("/Volumes/FCP_Edit/ProgramingDropBox/test.mov") 
=> 95053324 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/test.mov") 
=> 95053324 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 23769068 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 23769068 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 23769068 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 23769068 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 23769068 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 23769068 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 64888832 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 123609088 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 336691200 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 336691200 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 336691200 
>> File.size?("/Volumes/FCP_Edit/ProgramingDropBox/dumb.mov") 
=> 336691200 

回答

0

我不習慣拼音,但它看起來像它的讀取文件的大小,因爲它有空間的磁盤,而不是以字節爲單位的實際大小。

因爲每個文件通常佔用至少一個磁盤扇區,不管實際文件大小是否爲一個字節。

我建議通過文檔搜索更好的解決方案來閱讀實際的文件大小。

0

所以我仍然不知道爲什麼File.size?方法沒有得到正確的大小,但我發現通過調用系統du <filename>我每次調用該命令時都會獲得更新的文件大小。

所以基本上我在做什麼是:

IO.popen("du <filename>").readlines.first 

如果此命令返回相同的字符串兩次,我知道這個文件不被寫入了。

如果有人有一個更好的主意如何解決這個問題,我很樂意聽到它。

+0

您可能必須讓緩衝區在另一端齊平以得出結論。檢查'lsof'可能是一個更好的解決方案。 – strager 2010-06-23 11:27:24