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

时间:2017-01-13 07:52:25

标签: ruby strong-typing

e.g。 Dir.entries返回一个字符串数组与一个包含FileDir个实例的数组。 关于Dir和File类型的大多数方法。相比之下,这些情况是动态的。

没有Dir#foldersDir#files - 而是我明确

  1. 循环Dir.entries
  2. 为其构建路径(File.expand_path) 每个项目
  3. 检查File.directory?
  4. 在此目录中获取所有.svg 文件这样的简单用例似乎需要大量的箍/循环/检查。我使用Ruby是错误的还是Ruby的这个方面看起来非常不重要?

2 个答案:

答案 0 :(得分:4)

根据您的需要,FileDir可能会很好。

当您需要链接命令并且(正确地)认为仅使用带有字符串参数的类方法时,您可以使用Pathname。这是一个标准的图书馆。

实施例

Dirs and Files

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会有所帮助。

答案 1 :(得分:1)

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

打开所有.svg文件

svgs = Dir.glob(File.join('/path/to/dir', '*.svg'))

在Windows上,案例在文件路径中并不重要,但在所有unixoid系统中(Linux,MacOS ......)file.svgfile.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) }