Ruby on rails Ruby临时文件异常行为
这是我的pry会话输出:Ruby on rails Ruby临时文件异常行为,ruby-on-rails,ruby,file,temporary-files,pry,Ruby On Rails,Ruby,File,Temporary Files,Pry,这是我的pry会话输出: [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 [1]pry(Som
[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
[1]pry(SomeTask)>epub
=> #
[2] 撬(SomeTask)>epub.size
=> 134
[3] pry(SomeTask)>File.size(“/sometath/tmp/x.epub”)
=> 44299
[4] pry(SomeTask)>epub.class
=>临时文件
我发现File.size
产生的结果与Tempfile实例的size
方法不同
这怎么可能呢?细节才是关键。从(我的)文档中: size() 返回临时文件的大小。作为一种副作用,在确定大小之前会刷新IO缓冲区 发生的情况是,您正在使用
File.size
读取缓冲区刷新之前的文件大小,即在所有字节都写入文件之前,然后使用Tempfile#size
,在计算缓冲区大小之前刷新缓冲区:
tmp = Tempfile.new('foo')
tmp.write('a' * 1000)
File.size(tmp)
# => 0
tmp.size
# => 1000
但是看看在调用File.size(tmp)
之前调用tmp.size
时会发生什么:
通过手动刷新缓冲区,可以从File.size
中获得所需的行为:
tmp = Tempfile.new('baz')
tmp.write('a' * 1000)
tmp.flush
File.size(tmp)
# => 1000
我在Ruby 2.2.2上使用的是Pry版本0.10.1,无法复制这种情况:
[1] (pry) main: 0> foo = Tempfile.new('foo')
#<File:/var/folders/yb/whn8dwns6rl92jswry5cz87dsgk2n1/T/foo20150819-83612-1tpkqm4>
[2] (pry) main: 0> File.size(foo.path)
=> 0
[3] (pry) main: 0> foo.size
=> 0
在将一个字符写入foo
之后,数据已被缓冲,而不是像我预期的那样刷新到磁盘
[6] (pry) main: 0> foo.size
=> 1
[7] (pry) main: 0> File.size(foo.path)
=> 1
foo.size
刷新缓冲区,然后返回文件的大小,该大小与file.size
所说的大小相匹配
在处理由Tempfile创建的临时文件时,我们不关心或不想知道它们的大小。它们是暂时的,将(最终)消失,并被视为缓冲区。如果你需要一个更持久的文件,那么就创建并写入一个普通文件。你是否在不保存文件的情况下更改了
epub
的内容?你使用的是什么版本的Ruby和Pry?@SimoneCarletti:在我看来就是这样。但我不知道具体在哪里。所以,我刚刚做了epub.close和epub.open,现在我有了同步的文件。谢谢大家的回答!它是?我认为措辞是不同的。。。但它们是一样的。
[4] (pry) main: 0> foo.write('a')
=> 1
[5] (pry) main: 0> File.size(foo.path)
=> 0
[6] (pry) main: 0> foo.size
=> 1
[7] (pry) main: 0> File.size(foo.path)
=> 1