【问题标题】:How to check if a directory/file/symlink exists with one command in Ruby如何使用 Ruby 中的一个命令检查目录/文件/符号链接是否存在
【发布时间】:2011-06-21 07:40:05
【问题描述】:

是否有一种方法可以检测目录/文件/符号链接/等。实体(更广义的)存在吗?

我需要一个函数,因为我需要检查可能是目录、文件或符号链接的路径数组。我知道File.exists?"file_path" 适用于目录和文件,但不适用于符号链接(即File.symlink?"symlink_path")。

【问题讨论】:

  • 您使用的是哪个版本的 Ruby?文件已存在?适用于 OS X 10.6.6 中的 Ruby 1.9.2 中的符号链接
  • 澄清一下:对于符号链接,如果符号链接存在,您要求返回 true 的内容,无论它是否最终可以解析为非符号链接。 IE。对于断开的链接,它也应该返回trueFile.exists? 只会为未损坏的符号链接返回 true

标签: ruby file directory symlink exists


【解决方案1】:

标准的文件模块有通常的file tests 可用:

RUBY_VERSION # => "1.9.2"
bashrc = ENV['HOME'] + '/.bashrc'
File.exist?(bashrc) # => true
File.file?(bashrc)  # => true
File.directory?(bashrc) # => false

你应该可以在那里找到你想要的。


OP:“谢谢,但我需要所有三个真或假”

显然不是。好的,试试这样的:

def file_dir_or_symlink_exists?(path_to_file)
  File.exist?(path_to_file) || File.symlink?(path_to_file)
end

file_dir_or_symlink_exists?(bashrc)                            # => true
file_dir_or_symlink_exists?('/Users')                          # => true
file_dir_or_symlink_exists?('/usr/bin/ruby')                   # => true
file_dir_or_symlink_exists?('some/bogus/path/to/a/black/hole') # => false

【讨论】:

  • 我建议不要进行可能无法跨平台工作的原始字符串连接 (ENV['HOME'] + '/.bashrc')。您应该使用 Ruby 文件连接,如果您使用的是 Rails,为什么不从 Rails.root 开始。 File.exists?(Rails.root.join('db', 'my_seeds.csv')
  • 保证不能跨平台工作,因为 Windows 不知道 Bash,因此也不知道 .bashrc。但它可以在基于 *nix 的平台上工作。使用/ 不是问题,因为Ruby's IO automatically converts from forward slashes to back slashes on Windows
  • 也许在 2016 年 12 月确实如此,但 Windows 绝对确实了解 Bash。 :-) 我可以在“开始”菜单中输入bash,然后在生成的控制台窗口中,cat ~/.bashrc 会产生输出。 ¯\_(ツ)_/¯
  • 不幸的是,Cyril 的答案并不完全正确 - 字符串连接在 Windows 上是否适用于“File.exist?”检查,正如铁皮人已经指出的那样。我只是在此处添加此评论以确认它。
【解决方案2】:

为什么不定义自己的函数File.exists?(path) or File.symlink?(path) 并使用它呢?

【讨论】:

  • @Clawsy 我认为您错过了 Gintautas 的观点:您是一名程序员 - 如果您需要的功能不存在,您可以创建它。
  • 不,我没有错过重点:)。我完全理解。我只想在我的应用程序中添加尽可能少的代码。就我而言,如果我找到这样的方法会更好(对于软件工程而言)。如果没有,那就是……我做一个,没问题。我只是想知道是否有预定义的。我并不懒惰,它只是在一个巨大的应用程序中插入一个代码,必须得到很好的照顾。我只是想知道......因为我不想重复自己。 (DRY - 不要重复你自己,来自 Pragmatic Programmer 书:D)。
  • 既然已经是语言的一部分,为什么还要重新发明轮子?
  • 我发现在编程中不要过多关注细节非常有用。如果您知道解决问题的简单直接的方法,那就去做吧。如果一段时间后您找到更好的方法,您可以随时返回并修复。在这种情况下,定义一个新函数是轻而易举的事。
  • 但是,该功能已经内置在语言中并且易于使用。然后它变成了阅读以查看可用内容并添加调用的情况。编写代码来实现已经存在的功能只是因为您没有花时间阅读该语言附带的 RDoc……只是不适合我。按照这种逻辑,您最终可能会重写标准库。
【解决方案3】:

只需File.exist? 自己会为您处理上述所有事情

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2014-05-18
    • 2011-08-11
    • 1970-01-01
    • 2012-06-19
    • 2012-07-02
    • 2013-12-14
    • 2023-01-18
    相关资源
    最近更新 更多