2013-03-25 80 views
11

我收到以下錯誤:變量Errno :: ENOENT:沒有這樣的文件或目錄紅寶石

"Errno::ENOENT: No such file or directory" 

當我嘗試下載文件到不存在的目錄。

例如:

ftp = Net::FTP.new('example.com') 
ftp.login 
files = ftp.chdir('pub/lang/ruby/contrib') 
files = ftp.list('n*') 
ftp.getbinaryfile('nif.rb-0.91.gz', 'pub/lang/ruby/contrib/nif.gz', 1024) 
ftp.close 

然而,對於很多我將下載的文件,完整目錄路徑將不存在。例如,在第一個文件創建pub之前,它不會存在,這也適用於lang/ruby​​/contrib。

有沒有一種方法可以檢查目錄是否存在,如果不創建它們?我知道存在嗎?,但它看起來引用文件,並且不會創建完整路徑。我想我需要一些遞歸方法遍歷文件夾結構,直到它命中文件名。

編輯:mkdir_p似乎正是我需要的解決方案。

然而,當我使用 「/ A/B/C」 我注意到, FileUtils.mkdir_p(File.dirname(和localdir)) 返回一個錯誤的路徑:errno的:: EACCES:權限被拒絕 -/A

如果我手動刪除前面的「/」,它就會起作用。這是什麼造成的?解決錯誤的最佳解決方案是什麼?我應該只使用以下嗎?

path="https://stackoverflow.com/a/b/c" 
if path[0]="/" 
    path=path[1..-1] 
end 

但是,我覺得這只是一個破解。

回答

1

在fileutils模塊中,您可以使用mkdir_p,與mkdir -p命令類似,如果該路徑尚不存在,則該命令將創建完整路徑。

9

您不能保存到不存在的路徑。作爲開發者,您有責任在嘗試保存文件之前確保您的目標路徑存在。

Ruby有,讓你檢查是否存在一個文件或目錄的方法:

FileUtils.makedirs()mkpathmkdir_p的別名。我更喜歡makedirs,因爲它是一個助記符。

這也將是有益的:

這兩個我喜歡Dir.chdir之間,因爲它需要一個塊。該塊內發生的任何操作都發生在您更改的目錄中。在退出時,目錄會恢復到之前的狀態。

1

* nix mkdir -p,mkdir_p的模擬是您需要的,這是在另外兩個答案中提供的,但是我沒有看到任何人解決您關於權限的編輯問題。

解決方法是用戶調用腳本需要在根目錄下有寫權限。

路徑「/ a/b/c」尋址根路徑(「/」)。這通常只能寫入root用戶或具有sudo訪問權限的用戶。

當您修改路徑以刪除前導「/」時,您告訴mkdir_p創建相對於當前工作目錄而不是相對於根目錄的目錄「a/b/c」。修改版本的工作原因是因爲用戶調用ruby腳本具有對當前工作目錄的寫入權限。

作爲個人而言,如果腳本消費者正在提供路徑輸入,那麼您可能不想刪除前導斜槓,因爲它可以在與用戶期望的地方截然不同的位置創建文件/目錄。 。除非你的程序的目的是這樣,但是要把它弄清楚。

參考文獻:

相關問題