使用mkdir创建目录出现问题



刚接触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用于确保创建完整的路径。
  • 全局变量已被转换为参数

最新更新