2013-05-14 80 views
0

Ruby的新手,可能有点愚蠢用mkdir创建目录时遇到麻烦

试图创建一个目录以便在其中存储文件。这里是我的代码,这样做

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>' 
+0

'$ textFile'确实需要是一个全局变量吗?通常没有必要。 – tadman 2013-05-14 00:21:25

+0

您期望的示例文件夹名称? – matzone 2013-05-14 00:23:23

+0

变量的值是什么?从错误,它看起来像apath =“/Users/myname/Developer/Ruby/emails/email4.txt”,主题=“正确的主题”和日期=“正确的日期” – datguy 2013-05-14 00:29:44

回答

3

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

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 

我冒昧使这个例子更显著红宝石般的:

  • 的方法使用混合大小写的名字是非常不规则,全局变量皱起了眉头。
  • 使用for极其罕见,each更灵活。
  • 如果文件可以打开,File.open方法会产生一个块,并在块完成时自动关闭。
  • “.1”部分已扩展为保持循环,直到找到未使用的名称。
  • FileUtils用于确保创建完整路径。
  • 全局变量已转换为参数。
+0

的一部分。发生同样的错误 – Pinwheeler 2013-05-14 00:41:15

+0

不错。进一步的改进要考虑:除非存在测试来保护'mkdir_p',否则不需要。 Ruby 2现在有['File :: write'](http://www.ruby-doc.org/core-2.0/IO.html#method-c-write),当您只想将字符串转储到文件一枪。 – dbenhur 2013-05-14 00:44:22

+0

我错了,在File.open中发生错误让我看看我是否做了其他错误 – Pinwheeler 2013-05-14 00:47:02

2

如果您切换到mkdir_p,并得到了同样的错误,也许在'/Users/anthonydreessen/Developer/Ruby/emails/email4.txt/Re: Make it Brief Report Wed 8 May 2013'命名父母一方已存在的常规文件,不能像对待目录。可能是最后一个名为email.txt

+0

哦哇...感谢您的疑难解答。这是一个令人尴尬的问题 – Pinwheeler 2013-05-14 00:54:47

+1

乐意提供帮助。 (不要过于羯磨妓女,但我有点困惑,为什么datguy得到的信誉,当我的答案确定问题早于他一个小时。) – dbenhur 2013-05-14 02:56:05

+0

我看到datguy比你更少的业力,他早些时候在帮忙以及。我有点觉得,当你超过5K时,积分并不意味着太多。我希望我没有犯错。 – Pinwheeler 2013-05-14 22:55:19