检查文件/文件夹是否在Ruby中的子目录中
检查给定文件/目录是否位于其他目录(或其子目录之一)的最佳方法是什么?平台独立性和绝对/相对路径处理会更好 一个简单的方法就是搜索文件并每次检查,但也许有更好的方法检查文件/文件夹是否在Ruby中的子目录中,ruby,file,Ruby,File,检查给定文件/目录是否位于其他目录(或其子目录之一)的最佳方法是什么?平台独立性和绝对/相对路径处理会更好 一个简单的方法就是搜索文件并每次检查,但也许有更好的方法 e、 g.给定的目录A,是A在B根目录子树中的任何地方,即在下面?(A,B)或什么东西。一个好的快速方法是使用Ruby stdlib中Dir类提供的方法 glob( pattern, [flags] ) # => matches 展开pattern(模式数组或模式字符串),并将结果作为匹配项或给定给块的参数返回 可用于文件和
e、 g.给定的目录
A
,是A
在B
根目录子树中的任何地方,即在下面?(A,B)
或什么东西。一个好的快速方法是使用Ruby stdlib中Dir
类提供的方法
glob( pattern, [flags] ) # => matches
展开pattern(模式数组或模式字符串),并将结果作为匹配项或给定给块的参数返回
可用于文件和目录,并允许递归搜索。
它返回一个包含与模式匹配的文件/目录的数组,如果没有匹配的文件/目录,则该数组将为空
root = '/my_root'
value = 'et_voila.txt'
Dir.glob("#{root}/**/#{value}")
# ** Matches directories recursively.
# or you can pass also the relative path
Dir.glob("./foo/**/#{value}")
我希望我正确理解了你的问题 例如:
require 'pathname'
A = '/usr/xxx/a/b/c.txt'
path = Pathname.new(A)
[
'/usr/xxx/a/b',
'/usr/yyy/a/b',
].each{|b|
if path.fnmatch?(File.join(b,'**'))
puts "%s is in %s" % [A,b]
else
puts "%s is not in %s" % [A,b]
end
}
结果:
/usr/xxx/a/b/c.txt is in /usr/xxx/a/b
/usr/xxx/a/b/c.txt is not in /usr/yyy/a/b
该解决方案使用。它的一个优点是:Pathname表示文件系统上的文件或目录的名称,而不是文件本身。因此,您可以在没有文件读取权限的情况下进行测试
测试本身是使用和一个glob模式File.join(路径“**”)
(**
表示所有子目录)
如果您更经常需要它,您可以扩展Pathname
:
require 'pathname'
class Pathname
def is_underneath?(path)
return self.fnmatch?(File.join(path,'**'))
end
end
A = '/usr/xxx/a/b/c.txt'
path = Pathname.new(A)
[
'/usr/xxx/a/b',
'/usr/yyy/a/b',
].each{|b|
if path.is_underneath?(b)
puts "%s is in %s" % [A,b]
else
puts "%s is not in %s" % [A,b]
end
}
要处理绝对/相对路径,可以像中那样扩展路径(对不起,这是未测试的)
class Pathname
def is_underneath?(path)
return self.expand_path.fnmatch?(File.expand_path(File.join(path,'**')))
end
end