Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby临时文件异常行为_Ruby On Rails_Ruby_File_Temporary Files_Pry - Fatal编程技术网

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

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

这是我的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(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