2013-12-23 32 views
0

我必須在Windows 7上運行ruby腳本(我知道這是個壞主意)。 我的腳本創建文件夾(如果它們不存在)並將文件複製到它們中。 我使用的文件實用程序庫執行這項工作,如:必須在Windows 7上運行ruby腳本並獲得權限被拒絕EACCES

FileUtils.mkdir_p(path) 
FileUtils.cp_r(file.path, path) 
FileUtils.touch(file) 

在Ubuntu和Mac一切正常,但Windows 7的機器上我得到了一個錯誤:

Permission denied - ./program_folder/input/. (Errno::EACCES) 

這個代碼行:

Dir.entries('./program_folder/input').map { |file_name| File.new("./program_folder/input/#{file_name}") }.compact 

任何想法如何解決它?

我試圖用管理員權限運行Ruby和IRB吡嗪酰胺,並試圖在所有路徑,但仍然沒有改變做FileUtils.chmod_R(0777,@Path)...

回答

1

你的命令

Dir.entries('./program_folder/input').map { |file_name| 
    File.new("./program_folder/input/#{file_name}") 
}.compact 

嘗試創建一個與您之前讀取的文件/文件夾具有相同名稱的文件。

詳細地:

  1. 通過Dir.entries('.')找到的第一個文件是實際的目錄(.)。
  2. "./program_folder/input/#{file_name}"./program_folder/input/.(現有目錄)。
  3. 該目錄路徑應該是新文件的路徑。
  4. With File.new您無法打開目錄作爲文件。評論後

備註:

裏面的Dir.entries你叫File.new - 創建一個文件句柄。如果沒有模式,它會嘗試打開現有的文件(文件,而不是目錄!)。 .是不能作爲文件打開的目錄。

如果你只想要文件名,你不需要File.new,字符串"./program_folder/input/#{file_name}"就足夠了。 一個更好的解決辦法是File.join方法:

File.join("./program_folder/input", file_name) 

File.join(".", "program_folder", "input", file_name) 

如果你需要真正的文件名,你可以檢查目錄:

Dir.entries('./program_folder/input').map { |file_name| 
    "./program_folder/input/#{file_name}" unless File.directory?("./program_folder/input/#{file_name}") 
}.compact 

或更好,您刪除目錄:

Dir.entries('.').delete_if{|file_name| 
    File.directory?(file_name) 
} 
+0

我不覆蓋文件,我只是從這個Dir創建包含所有文件對象的數組。 「File.new根據給定的模式打開文件名稱的文件並返回一個新的File對象。「 – Extazystas

+0

看到我的編輯,我想,我現在明白你想達到什麼樣的效果了 – knut

+0

我明白了,我已經刪除了'。' ('./ program_folder/input')。map {| file_name | File.new(「./ program_folder/input /#{file_name}」)除非file_name =〜 /^\.\.?$/} .compact 現在我在這個代碼的'utime'權限中有Fileutils的另一個錯誤:FileUtils.touch(file) 所以,謝謝! – Extazystas

相關問題