使用mkdir创建目录时遇到问题

时间:2013-05-14 00:12:40

标签: ruby 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>'

3 个答案:

答案 0 :(得分:4)

我能够重新创建错误 - 看起来像email4.txt是常规文件,而不是目录,所以你不能将它作为目录路径的一部分使用。

答案 1 :(得分:2)

如果您切换到mkdir_p并获得相同的错误,则'/Users/anthonydreessen/Developer/Ruby/emails/email4.txt/Re: Make it Brief Report Wed 8 May 2013'中指定的父项之一可能已作为常规文件存在,并且不能被视为目录。可能最后一个名为email.txt

答案 2 :(得分:1)

你有正确的想法,但应该更具体地说明你正在打开的文件。更改当前工作目录非常麻烦,因为它会在整个过程中更改它并且可能会搞砸应用程序的其他部分。

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