4

我目前正在开发一个在特定文件夹中查找文件的脚本。我想复制这些文件。然后我想从那些重复文件中删除一些无用的行,用 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


±

我的临时文件的内容是空的。

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


好的!弄清楚了!在块内,我必须在读取内容之前将光标移回文件的开头。

4

3 回答 3

1

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

于 2012-11-02T09:53:29.247 回答
0

Try locale_file.close after write in your block. I don't believe the content is necessarily flushed to disk until then.

于 2012-10-30T18:34:06.557 回答
0

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

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

于 2012-10-30T18:47:56.320 回答