Ruby에서 하나의 명령으로 디렉토리 / 파일 / 심볼릭 링크가 있는지 확인하는 방법


83

디렉토리 / 파일 / 심볼 링크 / 등을 감지하는 한 가지 방법이 있습니까? 엔티티 (더 일반화 됨)가 존재합니까?

디렉토리, 파일 또는 심볼릭 링크가 될 수있는 경로 배열을 확인해야하므로 단일 함수가 필요합니다. 내가 알고있는 File.exists?"file_path"디렉토리와 파일에 대한 아니라 심볼릭 링크 (되는 작품 File.symlink?"symlink_path").


1
어떤 버전의 Ruby를 사용하고 있습니까? 파일이 존재? OS X 10.6.6의 Ruby 1.9.2에서 나를 위해 symlink를 위해 작동합니다.

1
명확히하기 위해 : 심볼릭 링크의 true경우 심볼릭 링크가 궁극적으로 비 심볼릭 링크로 해석 될 수 있는지 여부에 관계없이 심볼릭 링크가 존재하면 반환 하는 것을 요청합니다 . 즉, true끊어진 링크도 반환해야 합니다. 깨지지 않은 심볼릭 링크에 File.exists?대해서만 반환됩니다 true.
— Kelvin

답변:


147

표준 파일 모듈에는 사용 가능한 일반적인 파일 테스트가 있습니다.

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

1
ENV['HOME'] + '/.bashrc'크로스 플랫폼에서 작동하지 않을 수 있는 원시 문자열 연결 ( )을 사용하지 않는 것이 좋습니다. Ruby 파일 조인을 사용해야하며 Rails.rootRails를 사용하는 경우 시작하지 않는 이유도 있습니다 . File.exists?(Rails.root.join('db', 'my_seeds.csv')
— Cyril Duchon-Doris

2
Windows는 Bash에 대해 알지 못하므로 .bashrc에 대해 알지 못하기 때문에 크로스 플랫폼에서 작동하지 않는 것이 보장됩니다. 그러나 * nix 기반 플랫폼에서 작동합니다. Ruby의 IO는 Windows에서 자동으로 슬래시에서 백 슬래시로 변환/ 되기 때문에 사용은 문제가되지 않습니다 .
— 틴 남자

2016 년 12 월 에 그랬을 수도 있지만, Windows 는 요즘 Bash에 대해 확실히 알고 있습니다. :-) bash시작 메뉴에 입력 하면 콘솔 창에 cat ~/.bashrc출력이 생성됩니다. ¯ \ _ (ツ) _ / ¯
— 조나단 길버트

Cyril의 대답은 불행히도 완전히 정확하지 않습니다. 문자열 연결은 "File.exist?"에 대해 Windows에서 작동합니까? Tin Man이 이미 지적했듯이 확인합니다. 확인을 위해 여기에이 설명을 추가했습니다.
— shevy

14

자신의 기능을 정의 File.exists?(path) or File.symlink?(path)하고 사용하지 않겠습니까?


2
@Clawsy 나는 당신이 Gintautas의 요점을 놓치고 있다고 생각합니다 : 당신은 프로그래머입니다-필요한 함수가 존재하지 않으면 그것을 만들 수 있습니다.
— Telemachus

4
이미 언어의 일부인 휠을 재발 명하는 이유는 무엇입니까?
— The Tin Man

11
프로그래밍의 세부 사항에 너무 집착하지 않는 것이 매우 유용하다고 생각합니다. 문제를 해결하는 간단하고 간단한 방법을 알고 있다면 그냥하세요. 나중에 더 나은 방법을 찾으면 언제든지 돌아가서 수정할 수 있습니다. 이 상황에서 새로운 기능을 정의하는 것은 쉬운 일이 아닙니다.
— Gintautas Miliauskas

5
그러나 기능은 이미 언어에 내장되어 있으며 사용하기 쉽습니다. 그런 다음 사용 가능한 항목을 확인하고 호출을 추가하는 경우가됩니다. 언어와 함께 제공되는 RDoc을 읽는 데 시간을 할애하지 않았기 때문에 이미 존재하는 기능을 구현하는 코드를 작성하는 것은 나에게 합산되지 않습니다. 그 논리로 표준 라이브러리를 다시 작성할 수 있습니다.
— Tin Man

2
File.exist를 사용 하시겠습니까? 대신 File.exists? 이것은 루비 2.2.0에서 더 이상 사용되지 않습니다 : ruby-doc.org/core-2.2.0/File.html#method-c-exists-3F
— atw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.