刚接触Ruby,可能有点傻
试图创建一个目录以便在其中存储文件。下面是我的代码
def generateParsedEmailFile
apath = File.expand_path($textFile)
filepath = Pathname.new(apath + '/' + @subject + ' ' + @date)
if filepath.exist?
filepath = Pathname.new(filepath+ '.1')
end
directory = Dir.mkdir (filepath)
Dir.chdir directory
emailText = File.new("emailtext.txt", "w+")
emailText.write(self.generateText)
emailText.close
for attachment in @attachments
self.generateAttachment(attachment,directory)
end
end
这是我得到的错误
My-Name-MacBook-2:emails myname$ ruby etext.rb email4.txt
etext.rb:196:in `mkdir': Not a directory - /Users/anthonydreessen/Developer/Ruby/emails/email4.txt/Re: Make it Brief Report Wed 8 May 2013 (Errno::ENOTDIR)
from etext.rb:196:in `generateParsedEmailFile'
from etext.rb:235:in `<main>'
我能够重新创建错误-它看起来像email4.txt是一个常规文件,而不是一个目录,所以你不能使用它作为你的目录路径的一部分。
如果您切换到mkdir_p
并得到相同的错误,可能'/Users/anthonydreessen/Developer/Ruby/emails/email4.txt/Re: Make it Brief Report Wed 8 May 2013'
中命名的父文件之一已经作为常规文件存在,不能像目录一样对待。可能是最后一个叫email.txt
您的想法是正确的,但是应该更具体地说明您要打开的文件。更改当前工作目录是非常麻烦的,因为它会在整个过程中更改它,并可能搞乱应用程序的其他部分。
require 'fileutils'
def generate_parsed_email_file(text_file)
path = File.expand_path("#{@subject} #{date}", text_file)
while (File.exist?(path))
path.sub!(/(.d+)?$/) do |m|
".#{m[1].to_i + 1}"
end
end
directory = File.dirname(path)
unless (File.exist?(directory))
FileUtils.mkdir_p(directory)
end
File.open(path, "w+") do |email|
emailText.write(self.generateText)
end
@attachments.each do |attachment|
self.generateAttachment(attachment, directory)
end
end
我冒昧地使这个例子更像ruby:
- 在方法中使用混合大小写是非常不规范的,全局变量是不被允许的。
- 很少看到
for
被使用,each
更灵活。 - 如果文件可以打开,
File.open
方法将产生一个块,当块完成时自动关闭。 - "。1"部分被扩展为循环,直到找到一个未使用的名称。
- FileUtils用于确保创建完整的路径。
- 全局变量已被转换为参数