e.g。 Dir.entries
返回一个字符串数组与一个包含File
或Dir
个实例的数组。
关于Dir和File类型的大多数方法。相比之下,这些情况是动态的。
没有Dir#folders
或Dir#files
- 而是我明确
Dir.entries
File.expand_path
)
每个项目File.directory?
在此目录中获取所有.svg 文件这样的简单用例似乎需要大量的箍/循环/检查。我使用Ruby是错误的还是Ruby的这个方面看起来非常不重要?
答案 0 :(得分:4)
当您需要链接命令并且(正确地)认为仅使用带有字符串参数的类方法时,您可以使用Pathname
。这是一个标准的图书馆。
require 'pathname'
my_folder = Pathname.new('./')
dirs, files = my_folder.children.partition(&:directory?)
# dirs is now an Array of Pathnames pointing to subdirectories of my_folder
# files is now an Array of Pathnames pointing to files inside my_folder
如果由于某种原因可能存在.svg
扩展名的文件夹,您只需过滤Pathname.glob
返回的路径名:
svg_files = Pathname.glob("folder/", "*.svg").select(&:file?)
如果您需要特定的语法:
class Pathname
def files
children.select(&:file?)
end
end
aDir = Pathname.new('folder/')
p aDir.files.find_all{ |f| f.extname == '.svg' }
Pathname#find
会有所帮助。
答案 1 :(得分:1)
在打开文件之前,它只是一个路径(字符串)。
打开所有.svg文件
svgs = Dir.glob(File.join('/path/to/dir', '*.svg'))
在Windows上,案例在文件路径中并不重要,但在所有unixoid系统中(Linux,MacOS ......)file.svg
与file.SVG
不同
要获取所有.svg
个文件和.SVG
个文件,您需要File :: FNM_CASEFOLD标志。
如果要递归获取.svg
个文件,则需要**/*.svg
svgs = Dir.glob('/path/to/dir/**/*.svg', File::FNM_CASEFOLD)
如果您希望目录以.svg
结尾,则将其过滤掉
svgs.reject! { |path| File.directory?(path) }