如何将文件复制为TempFile?

时间:2012-10-30 18:25:18

标签: ruby

我目前正在开发一个查找特定文件夹中文件的脚本。 我想要复制这些文件。然后我想从这些重复文件中删除一些无用的行,在YAML中解析它们(这是其中的内容格式)。最后制作文件的差异。

我首先考虑将它们复制到tmp文件夹中,但我刚刚发现Tempfile的存在,这似乎正是我所需要的,因为在脚本出现后必须删除临时文件完成了它的工作。

我现在拥有的东西:

require 'Tempfile'
require 'YAML'

PWD = File.dirname(__FILE__)
LOCALES_FOLDER_PATH = "#{PWD}/../app/assets/javascripts/ayl/bo/config/locales"
LOCALES = ['en', 'fr']

files_data = {}
locale_file_names = LOCALES.map{|locale| "#{locale}.js.coffee"}
files = locale_file_names.map do |locale_file_name|
  files_data[locale_file_name] = "#{LOCALES_FOLDER_PATH}/#{locale_file_name}"
end

locale_files = []
files.each do |file|

  content = File.open(file).read
  locale_file = Tempfile.open file.gsub("/", "_") do |f|
    f.write content
    f.flush
    puts f.read
  end
  locale_files << locale_file

end

结果:

± ruby diff_locales.rb
/Users/adrien/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/YAML.rb:48: warning: already initialized constant ENGINE
/Users/adrien/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/YAML.rb:69: warning: already initialized constant ENGINE
/Users/adrien/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/YAML.rb:73: warning: already initialized constant ENGINE


±

我的临时文件内容为空。

这对我来说似乎很奇怪。但我认为他们是我不知道/理解的东西。


好的!想出来!在块中,我必须在阅读内容之前将光标移回文件的开头。

3 个答案:

答案 0 :(得分:1)

在块中,我必须在阅读内容之前将光标移回文件的开头。

答案 1 :(得分:0)

在您的区块中locale_file.close后尝试write。我不相信在此之前内容必须刷新到磁盘。

答案 2 :(得分:0)

默认情况下,所有ruby IO都是缓冲的。您可以在IO上调用#flush将所有内容写入磁盘,然后调用#read即可运行。关闭临时文件将删除它(这就是重点)。

此外,您应该更喜欢Tempfile.open的块版本,因为它保证在块退出时关闭并删除临时文件(而不是在程序运行时保持打开)