使用File.join()
是錯誤的。 .join()
返回一個字符串,然後向其應用.last
會生成一個錯誤,因爲String對象沒有.last
方法。
pry(main)> extension = '.xml'
=> ".xml"
pry(main)> File.join(extension).last
NoMethodError: undefined method `last' for ".xml":String
相反,你需要通過你想加入到一個文件路徑路徑元素的數組:
pry(main)> File.join('.', 'path', 'to', 'a', 'file.ext')
=> "./path/to/a/file.ext"
或:
pry(main)> File.join('/', 'path', 'to', 'a', 'file.ext')
=> "/path/to/a/file.ext"
花時間閱讀有關Ruby的File
類。它允許您以相當獨立於操作系統的方式處理文件和路徑。
其dirname
,basename
和extname
方法解剖路徑時很方便:
pry(main)> File.dirname('/path/to/a/file.ext')
=> "/path/to/a"
pry(main)> File.basename('/path/to/a/file.ext')
=> "file.ext"
pry(main)> File.extname('/path/to/a/file.ext')
=> ".ext"
另外還有split
方法相結合dirname
和basename
,都返回路徑和「FILENAME.EXT」讓您在使用並行分配:
pry(main)> dirname, filename = File.split('/path/to/a/file.ext')
=> ["/path/to/a", "file.ext"]
File.basename
需要一個可選的「擴展」參數,允許它剝離extensi上:
pry(main)> File.basename('/path/to/a/file.ext', '.ext')
=> "file"
結合所有的神奇善良,你可以摺疊,主軸和毀壞你的文件名和路徑整天。
我假設你的意思是*擴展*,而不是*前綴*,並且我更新了你的問題以反映這一點。 – 2012-04-09 15:25:46
@AndrewMarshall,是的謝謝隊友。前綴是添加到開頭的單詞部分。 – SHUMAcupcake 2012-04-09 15:30:10
作爲使用上述代碼的任何人的警告;正如所寫,它有可能多次檢索相同的URL,浪費時間和帶寬。一個頁面與站點上的其他頁面有多個鏈接是很常見的,當代碼遍歷''標籤時,每個頁面都會被訪問。由於OP的要求是針對頁面中列出的XML文件,因此可能會避免該問題,但代碼的其他用途可能不會那麼幸運。添加一個跟蹤以前檢索到的URL的'set',或者首先掃描頁面上的URL並將它們存儲在集合中,然後遍歷它。 – 2012-04-09 16:33:43