gpt4 book ai didi

ruby-on-rails - Ruby 临时文件异常行为

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:09 25 4
gpt4 key购买 nike

这是我的窥探 session 输出:

[1] pry(SomeTask)> epub
=> #<File:/somepath/tmp/x.epub>
[2] pry(SomeTask)> epub.size
=> 134
[3] pry(SomeTask)> File.size("/somepath/tmp/x.epub")
=> 44299
[4] pry(SomeTask)> epub.class
=> Tempfile

我看到 File.size 产生的结果与 Tempfile 实例的 size 方法不同。

这怎么可能?

最佳答案

细节决定成败。来自 Tempfile#size 的文档(强调我的):

size()

Returns the size of the temporary file. As a side effect, the IO buffer is flushed before determining the size.

发生的事情是您正在使用 File.size 在缓冲区被刷新之前读取文件的大小——即在所有字节都写入文件之前 — 然后您正在使用 Tempfile#size,它会在计算大小之前刷新该缓冲区:

tmp = Tempfile.new('foo')
tmp.write('a' * 1000)
File.size(tmp)
# => 0
tmp.size
# => 1000

但是看看当你调用 tmp.size 之前 File.size(tmp) 时会发生什么:

tmp = Tempfile.new('bar')
tmp.write('a' * 1000)
tmp.size
# => 1000
File.size(tmp)
# => 1000

您可以通过手动刷新缓冲区从 File.size 中获得您想要的行为:

tmp = Tempfile.new('baz')
tmp.write('a' * 1000)
tmp.flush
File.size(tmp)
# => 1000

关于ruby-on-rails - Ruby 临时文件异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32104526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com