我目前正在开发一个查找特定文件夹中文件的脚本。 我想要复制这些文件。然后我想从这些重复文件中删除一些无用的行,在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
±
我的临时文件内容为空。
这对我来说似乎很奇怪。但我认为他们是我不知道/理解的东西。
好的!想出来!在块中,我必须在阅读内容之前将光标移回文件的开头。
答案 0 :(得分:1)
在块中,我必须在阅读内容之前将光标移回文件的开头。
答案 1 :(得分:0)
在您的区块中locale_file.close
后尝试write
。我不相信在此之前内容必须刷新到磁盘。
答案 2 :(得分:0)
默认情况下,所有ruby IO都是缓冲的。您可以在IO上调用#flush将所有内容写入磁盘,然后调用#read即可运行。关闭临时文件将删除它(这就是重点)。
此外,您应该更喜欢Tempfile.open的块版本,因为它保证在块退出时关闭并删除临时文件(而不是在程序运行时保持打开)