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

Posted

技术标签:

【中文标题】检查 path 是不是是目录路径(它可能不存在)【英文标题】:Check if path is a directory path (it might not exist)检查 path 是否是目录路径(它可能不存在) 【发布时间】:2020-12-22 12:25:38 【问题描述】:

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

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

【问题讨论】:

这能回答你的问题吗? How to check if a given directory exists in Ruby 【参考方案1】:

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,您可能需要使用字符类来检查 *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 构造函数,以确保首先构建带有尾随分隔符的名称。如果您不能或不会这样做,您将不得不将它留给您的文件系统编写代码来显式地在预期的文件系统对象上显式调用适当的方法。例如:

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

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

【讨论】:

以上是关于检查 path 是不是是目录路径(它可能不存在)的主要内容,如果未能解决你的问题,请参考以下文章

如何检查文件是不是存在无异常?

如何检查文件是不是存在无异常?

如何检查文件是不是存在无异常?

如何检查文件是不是存在无异常?

检查目录是不是存在于lua中?

检查目录是不是存在于lua中?