检查路径是否为目录路径(它可能不存在)

Check if path is a directory path (it might not exist)

在 ruby 中,我可以使用 Pathname("/some/path/").directory? 检查路径是否实际上是一个目录。这仅在目录实际存在时才有效。

如何检查 Pathname("/some/path/") 是否是一个目录的路径,即使它不存在?它必须与平台无关,所以我不能只检查尾部斜杠。

TL;DR

如果路径名不在文件系统中,它只是一个名称。在您使用它创建文件系统对象之前,它的类型(例如文件或目录)是不固定的。因此,我建议要么明确地使用尾随分隔符构建每个目录路径名,要么使用路径名通过其预期类型的​​相关方法创建文件或目录。

使用尾随目录分隔符测试路径名对象

如果您使用的是路径名模块,则路径名不必存在即可使用。在这种情况下,注意 Ruby 引擎在 Windows 上将正斜杠转换为反斜杠很有用,因此以下构造的路径名应该适用于 Windows、Linux、MacOS , 和 Unix:


Pathname('/some/path/').to_s.end_with? ?/
#=> true

Pathname('C:/some/path/').to_s.end_with? ?/
#=> true

但是,如果您的路径名是手动或以编程方式构造的,而没有从文件系统中读取或使用 File#join,您可能需要使用字符 class 来检查 *nix 和 Windows 尾随分隔符。例如:

require 'pathname'

%w[ /some/path/ C:\some\path\ ].map do |path|
  Pathname(path).to_s.match? %r![/\]\z!
end
#=> [true, true]

使用方法设置文件系统对象类型

如果你构造一个路径 没有 尾随的目录分隔符,但该目录实际上并不存在于文件系统中,那么你不能仅从名称确定它是否应该成为文件或目录。路径名实际上只是一种特殊类型的字符串对象。文档 explicitly states(强调我的):

Pathname represents the name of a file or directory on the filesystem, but not the file itself.

在这种情况下,最好的办法是修改路径名构造函数,以确保首先使用尾随分隔符构建名称。如果你不能或不愿这样做,你将不得不把它留给你的文件系统 编写 代码来明确地在预期的文件系统对象上显式调用适当的方法。例如:

require 'pathname'
require 'fileutils'

path = Pathname '/tmp/foo'

# ensure file or directory doesn't already exist
path.rmtree

# use path as file
FileUtils.touch path
path.file?
#=> true

# remove path before next test
path.unlink

# use path as directory
path.mkpath
path.directory?
#=> true

如您所见,不带尾随(反)斜杠的路径名可用于文件 目录,具体取决于您的使用方式。