0

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>'
4

3 回答 3

4

我能够重新创建错误 - 看起来 email4.txt 是常规文件,而不是目录,因此您不能将其用作目录路径的一部分。

于 2013-05-14T00:54:23.797 回答
2

如果您切换到mkdir_p并得到相同的错误,则可能其中一个名为 in 的父级'/Users/anthonydreessen/Developer/Ruby/emails/email4.txt/Re: Make it Brief Report Wed 8 May 2013'已经作为常规文件存在,不能像目录一样对待。应该是最后一个名字email.txt

于 2013-05-14T00:47:51.133 回答
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 用于确保创建完整的路径。
  • 全局变量已转换为参数。
于 2013-05-14T00:31:25.383 回答