2012-12-21 52 views
0

我正在尝试写入子目录中的文件。这个文件是由代码创建的,但是一旦文件被创建,在脚本完成执行后它就是空的。我究竟做错了什么?Ruby:写入子目录中的文件

# 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为空。为什么?

+3

尝试用'file.close'代替'file.rewind' – AJcodez

+1

是的,我只是写了同样的评论...我无法重新创建问题。无论是哪种情况,您都应该关闭文件,但如果不解决问题,请列出您的操作系统和Ruby版本。 – rudolph9

+0

您也可以在关闭/倒带文件之前添加一个file.flush – TheConstructor

回答

3

习语红宝石将使用块写入文件:

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 

这在块的结束时自动关闭该文件。

+0

是的,那么块解决方案很有帮助。 – simonszu