检查文件/文件夹是否在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