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.