2017-03-20 63 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的電話應該可以正常工作。