为什么 Ruby 的文件相关类型是基于字符串的(字符串类型)?

Why are Ruby's file related types string-based (stringly typed)?

例如Dir.entries returns 字符串数组与包含 FileDir 实例的数组。 Dir 和 File 类型的大多数方法。相比之下,这些实例是贫血的。

没有 Dir#foldersDir#files - 相反我明确地

  1. 循环 Dir.entries
  2. 构建路径 (File.expand_path) 每一项
  3. 检查File.directory?

像获取此目录中的所有 .svg 文件 这样的简单用例似乎需要多个 hoops/loops/checks。我是不是用错了 Ruby 或者 Ruby 的这个方面看起来很不像 ruby-ish?

根据您的需要,File or Dir 可能就可以了。

当您需要链接命令并且(理所当然地)认为 un-ruby-ish 只使用带有字符串参数的 class 方法时,您可以使用 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 文件

如果由于某种原因可能存在扩展名为 .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 会有帮助。

在您打开文件之前,它只是一个路径(字符串)。

打开所有 .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) }