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

あなたのブロックでlocale_file.close後で試してみてください。writeそれまでは、コンテンツが必ずしもディスクにフラッシュされるとは思いません。

于 2012-10-30T18:34:06.557 に答える
0

すべてのrubyIOはデフォルトでバッファリングされます。IOで#flushを呼び出してすべてをディスクに書き込んでから、#readを呼び出すことができます。一時ファイルを閉じると、それが削除されます(それがポイントです)。

さらに、Tempfile.openのブロックバージョンを使用することをお勧めします。これは、ブロックが終了したときに一時ファイルが閉じられて削除されることを保証するためです(プログラムの実行中は開いたままにするのではありません)。

于 2012-10-30T18:47:56.320 に答える