使用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