1

サブディレクトリ内のファイルに書き込もうとしています。このファイルはコードによって作成されますが、ファイルが作成されると、スクリプトの実行が終了すると空になります。私は何を間違っていますか?

# Creating output files
print "Creating output files and filling root menu..."
FileUtils.cd(outdir) do
  file = File.new("directory.xml", "w")
  file.puts "<?php header(\"Content-type: text/xml\"); ?>"
  file.puts "<CiscoIPPhoneMenu>"
  file.puts "<Title>Telefonbuch</Title>"
  file.puts "<Prompt>Dir External</Prompt>"
  letters_used.each do |letter|
    filename = "contacts_" + letter + ".xml"
    FileUtils.touch(filename)
    file.puts "<MenuItem>"
    file.puts "<Name>" + letter.upcase + "</Name>"
    file.puts "<URL>http://" + HOSTNAME + WEBSERV_DIR + "/" + filename + "</URL>"
    file.puts "</MenuItem>"
  end
  file.puts "</CiscoIPPhoneMenu>"
  file.rewind
end
print "Done\n"

「directory.xml」は、スクリプトによって作成される各「contacts_letter.xml」ファイルにリンクする必要がありますが、directory.xml は空です。なんで?

4

1 に答える 1

4

慣用的な Ruby は、ブロックを使用してファイルに書き込みます。

File.new("directory.xml", "w") do |fo|
  fo.puts "<?php header(\"Content-type: text/xml\"); ?>"
  fo.puts "<CiscoIPPhoneMenu>"
  fo.puts "<Title>Telefonbuch</Title>"
  fo.puts "<Prompt>Dir External</Prompt>"
  letters_used.each do |letter|
    filename = "contacts_" + letter + ".xml"
    FileUtils.touch(filename)
    fo.puts "<MenuItem>"
    fo.puts "<Name>" + letter.upcase + "</Name>"
    fo.puts "<URL>http://" + HOSTNAME + WEBSERV_DIR + "/" + filename + "</URL>"
    fo.puts "</MenuItem>"
  end
  fo.puts "</CiscoIPPhoneMenu>"
end

これにより、ブロックの最後でファイルが自動的に閉じられます。

于 2012-12-21T14:59:46.347 に答える