【问题标题】:Ruby File.new `initialize': No such file or directoryRuby File.new `initialize':没有这样的文件或目录
【发布时间】:2013-04-18 12:26:28
【问题描述】:

我完全被这个难住了。我正在尝试调试一些创建FirstRun 文件的代码,作为程序已经完成第一次运行设置的标记。它尝试在absworkingdir 变量给出的指定工作目录中创建它。但是,当它尝试使用 File.new 创建文件时,出现以下错误

`initialize': No such file or directory '

以下是相关代码:

#First run setup
puts workingdir#debug
absworkingdir = File.expand_path(workingdir)
puts absworkingdir#debug
if File.exist?("#{absworkingdir}/FirstRun.lock") == false
    puts "This appears to be the first run of FigShare Sync. We'll setup a few things."
    print "Where would you like to store settings and files? [~./figsharesync]: "
    @input = gets.chomp
    puts @input#debug
        if @input.empty? == false
            workingdir = @input
            absworkingdir = File.expand_path(workingdir)
        end
    print "Please enter OAuth consumer key: "
    consumerkey = gets.chomp
    print "Please enter OAuth consumer key secret: "
    consumersecret = gets.chomp
    print "Please enter OAuth access token: "
    accesstoken = gets.chomp
    print "Please enter OAuth access token secret: "
    accesstokensecret = gets.chomp
    puts "Great! we'll get running now..."
puts absworkingdir#debug
File.new("#{absworkingdir}/FirstRun.lock", "r")
end

这是调试行的输出:

~/.figsharesync/                                                                                                                                                                                                                        
/var/lib/stickshift/5165dc1e4382ec92040001a8/app-root/data/.figsharesync                                                                                                                                                                
This appears to be the first run of FigShare Sync. We'll setup a few things.                                                                                                                                                            
Where would you like to store settings and files? [~./figsharesync]:                                                                                                                                                                    

Please enter OAuth consumer key:                                                                                                                                                                                                        
Please enter OAuth consumer key secret:                                                                                                                                                                                                 
Please enter OAuth access token:                                                                                                                                                                                                        
Please enter OAuth access token secret:                                                                                                                                                                                                 
Great! we'll get running now...                                                                                                                                                                                                         
/var/lib/stickshift/5165dc1e4382ec92040001a8/app-root/data/.figsharesync                                                                                                                                                                
source/figsharesync2.rb:38:in `initialize': No such file or directory - /var/lib/stickshift/5165dc1e4382ec92040001a8/app-root/data/.figsharesync/FirstRun.lock(Errno::ENOENT)                                                          
    from source/figsharesync2.rb:38:in `new'                                                                                                                                                                                        
    from source/figsharesync2.rb:38:in `<main>'     

【问题讨论】:

  • 尝试了来自@JulienLanglois 和 iamnotmaynard 的建议,但无济于事。我仍然收到相同的“不存在”错误。
  • 对于其他遇到此问题的人,这确实是 Cloud 9 问题。终端默认为~/ 中的文件夹,通常是六位数字。例如。 ~/111111/

标签: ruby file


【解决方案1】:

你想对 File.new 使用写模式,否则你说你想以读模式打开一个不存在的文件:

f = File.new("#{absworkingdir}/FirstRun.lock", "w")
f.close

【讨论】:

  • 啊,这正是我想要的。谢谢!我想我也可以通过{} 来立即关闭文件。有什么理由我应该使用 File.open 而不是这种方法?
  • 你是对的,你可以只使用 File.open("#{absworkingdir}/FirstRun.lock", "w") {},而不是 File.new :) 前者让你少一个变量,后者更明确。
  • @user2276204,您能否提供有关该问题的更多详细信息(据我所知,它正在进行中)?您确定一切都与错误相同吗?
  • 错误信息与问题中的相同。是否与在 Cloud 9 IDE 内的虚拟机中运行它有关?
  • 它可能是,虽然我只是尝试了一个最小的例子 (File.new("#{File.expand_path(Dir.pwd)}/test.txt", 'w').close)似乎工作得很好。 (顺便说一句,很酷的网站,我从未听说过)。
【解决方案2】:

您处于条件为“如果此文件不存在”的 if 块中,然后您尝试打开不存在的文件进行读取。那显然行不通。您可能希望打开写作而不是阅读。

【讨论】:

  • 谢谢。我的印象是File.new 是用于创建一个新文件。还有什么我应该使用的吗?在块之外执行此操作的问题在于,在这种情况下,文件已经存在,所以我不需要创建它。
【解决方案3】:

您没有名为/var/lib/stickshift/5165dc1e4382ec92040001a8/app-root/data/.figsharesync/FirstRun.lock 的文件可供打开阅读。如果您尝试创建要写入的新文件,则需要使用模式"w"(写入),如果文件不存在则创建文件,而不是需要文件的"r"(读取)已经存在了。

有关这些模式的更多信息,请参阅the docs。还有http://www.ruby-doc.org/core-1.9.3/File.html

【讨论】:

    【解决方案4】:

    尝试使用 w+ 作为写入模式,而不仅仅是 w:

    File.open("out.txt", "w+") { |file| file.write("boo!") }
    

    见:How to create a file in Ruby

    【讨论】:

    • ww+ 都创建一个新的可写文件。区别在于,w 打开只写模式,而w+ 打开读写模式。 stackoverflow.com/a/7915881
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2016-02-20
    • 2013-04-06
    相关资源
    最近更新 更多