为什么 Ruby 的文件相关类型是基于字符串的(字符串类型)?
Why are Ruby's file related types string-based (stringly typed)?
例如Dir.entries
returns 字符串数组与包含 File
或 Dir
实例的数组。
Dir 和 File 类型的大多数方法。相比之下,这些实例是贫血的。
没有 Dir#folders
或 Dir#files
- 相反我明确地
- 循环
Dir.entries
- 构建路径 (
File.expand_path
)
每一项
- 检查
File.directory?
像获取此目录中的所有 .svg 文件 这样的简单用例似乎需要多个 hoops/loops/checks。我是不是用错了 Ruby 或者 Ruby 的这个方面看起来很不像 ruby-ish?
当您需要链接命令并且(理所当然地)认为 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) }
例如Dir.entries
returns 字符串数组与包含 File
或 Dir
实例的数组。
Dir 和 File 类型的大多数方法。相比之下,这些实例是贫血的。
没有 Dir#folders
或 Dir#files
- 相反我明确地
- 循环
Dir.entries
- 构建路径 (
File.expand_path
) 每一项 - 检查
File.directory?
像获取此目录中的所有 .svg 文件 这样的简单用例似乎需要多个 hoops/loops/checks。我是不是用错了 Ruby 或者 Ruby 的这个方面看起来很不像 ruby-ish?
当您需要链接命令并且(理所当然地)认为 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) }