2017-03-20 65 views
0

所以我有下面的代码导致问题:运行时错误与水晶 - “打开文件时出错”

if File.file?(indexPath) 
    puts "Have to move index" 
    File.rename(indexPath, "#{indexPath}.old") 
end 
File.new(indexPath) 
File.write(indexPath, "test")#handler.getDoc) 
sleep 60.second 

我会假设,如果该文件存在,这将检查,并写入之前对其进行备份新的index.html。相反,我得到以下运行时错误:

Error opening file './assets/index.html' with mode 'r': No such file or directory (Errno) 
0x10098ab45: *CallStack::unwind:Array(Pointer(Void)) at ?? 
0x10098aae1: *CallStack#initialize:Array(Pointer(Void)) at ?? 
0x10098aab8: *CallStack::new:CallStack at ?? 
0x10097c001: *raise<Errno>:NoReturn at ?? 
0x1009c9dd9: *File#initialize<String, String, Int32, Nil, Nil>:(Event::Event | Nil) at ?? 
0x1009cbba9: *File#initialize<String>:(Event::Event | Nil) at ?? 
0x1009cbb51: *File::new<String>:File at ?? 
0x10097148b: __crystal_main at ?? 
0x100981758: main at ?? 

回答

1

File.new创建File类,而不是一个新文件的新实例。既然你没有给它更多的参数,它试图以读取模式打开给定的文件,你只是把它移走,以至于失败。

要创建一个空文件,可以使用File.touch,但是在写模式下打开一个文件,该文件在内部执行时会在文件不存在时创建该文件。

所以只要删除File.new的电话应该可以正常工作。