2011-07-04 2 views
39

내 Windows 7 컴퓨터에 Ruby 1.9.2를 설치했습니다. 간단한 analyzer.rb 파일을 만들었습니다. 나는이 코드를 실행하면Ruby의 File.open에서 "No such file or directory-text.txt (Errno :: ENOENT)"오류가 발생했습니다.

File.open("text.txt").each {|line| puts line} 

, 그것은 나에게 오류를 제공합니다 :

analyzer.rb:1:in `initialize': No such file or directory - text.txt (Errno::ENOENT) 
from analyzer.rb:1:in `open' 
from analyzer.rb:1:in `<main>' 
Exit code: 1 

나는 그것을 얻지 않는다 그것은이 한 줄이있다. analyzer.rb 파일과 동일한 디렉토리에 text.txt 파일이 있습니다. 또한 파일의 절대 경로 인 C:\Ruby192\text.txt을 먹이려고했지만 주사위가 없습니다. 내가 뭘 놓치고 있니?

답변

62

현재 작업 디렉토리이 (가) 실행중인 스크립트에 해당하는지 파악한 다음 시작하십시오.
처음에 다음 행을 추가하십시오.

puts Dir.pwd.

이것은 현재 작업 디렉토리 인 ruby가 스크립트를 실행하고 있음을 알려줍니다. 당신은 그것이 당신이 가정하는 곳이 아닌 것을 볼 수 있습니다. 그런 다음 창에 대해 경로 이름을 올바르게 지정했는지 확인하십시오. 제대로 창에 대한 경로 이름을 포맷하는 방법을 여기에 문서를 참조하십시오 :

http://www.ruby-doc.org/core/classes/IO.html

다음 중 하나에 따라 파일에 절대 경로 이름을 text.txt 인 장소로 작업 디렉토리를 변경하거나 지정 Dir.chdir를 사용 위 IO 문서의 지침 즉

편집

당신이 당신의 스크립트 파일 중 텍스트 파일을 넣어하는 경우, 가장 편리한 하나가 될 수있는 제 3의 솔루션을 추가 ...를 수행해야합니다

Dir.chdir(File.dirname(__FILE__)) 

이렇게하면 현재 작업 디렉토리가 스크립트를 실행중인 .rb 파일과 동일한 디렉토리로 자동 변경됩니다.

+0

에서 제안 된대로 'File.open (File.expand_path (__ FILE__,'...)을 사용할 수도 있습니다. Dir.pwd는 그 트릭을 만들었는데 C : \ Ruby192를보고 있었는데 C : \ Ruby192 \ bin에 텍스트 파일을 넣었습니다. 일단 그것을 올바른 위치에 놓았 으면 매력처럼 작동했습니다. 감사합니다! –

+3

@enraged 낙타 : 일반적으로 텍스트 파일을 두어서는 안됩니다. 파일이 많을수록 무언가를 삭제할 확률이 높아집니다. –

+0

감사합니다! Nagios에서 백그라운드에서 루비 스크립트 ...'Dir.chdir'이 트릭을했습니다! – Arpit

13

ENOENT은 존재하지 않는다는 것을 의미합니다. 디렉토리에 (그리고 따라서이보고 무슨 디렉토리)을 확인하려면

Dir.glob(".") 

를 사용해보십시오

File.open(File.dirname(__FILE__) + '/text.txt').each {|line| puts line} 
+0

당신의 응답을 주셔서 감사처럼 바로 아래 파일을 열 수 있습니다. 그러나 그것은 도움이되지 않았다. .rb 파일 바로 옆에있는 Ruby 설치 디렉토리에 text.txt가 있지만 여전히 동일한 오류가 발생합니다. 그것이 그것을 발견하지 못할 수도있는 몇 가지 이유가 무엇입니까? –

+0

사실 가장 좋은 해결책은'Dir.chdir (File.dirname (__ FILE __))'일 수 있습니다. 그렇게하면 작업 디렉토리가 스크립트와 동일하게 보장됩니다. – Casper

+0

https://github.com/travis-ci/travis-ci/issues/4656#issuecomment-131212402 –

2

:

그냥 당신의 코드를 업데이트합니다.

2

이 잘못된 디렉토리에있는 옆에 난 그냥 다른 변형에 대한 트립 :

내가 폭발 File.open(my_file).each {|line| puts line}했다하지만 난에서 작업 한 디렉토리에 해당 이름의 무언가가 있었다 (명령 행에서 LS의 이름을 보여 주었다). 나는 이상하게도 false을 돌려 준 File.exists?(my_file) 으로 확인했다. 설명 : my_file은 더 이상 존재하지 않는 심볼릭 링크였습니다! File.exists?은 심볼릭 링크를 따를 것이므로 링크가 아직 있지만 false이라고 말할 것입니다.

4

STDIN으로 chomp() 또는 chomp()을 사용하십시오

즉 test1.rb

print 'Enter File name: ' 

fname = STDIN.gets.chomp() # or fname = gets.chomp() 


fname_read = File.open(fname) 

puts fname_read.read() 
1

동감 캐스퍼의 대답 :

puts Dir.pwd 

을하는 즉시 현재 작업 디렉토리를 알고, 파일 경로를 지정 그 디렉토리에 상대적으로. 작업 디렉토리는 프로젝트 루트 인 경우

는 예를 들어,이

json_file = File.read(myfile.json) 
관련 문제