2010-03-06 148 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