2011-07-04 9 views
39

Win 7マシンにRuby 1.9.2をインストールしました。単純なanalyzer.rbファイルを作成しました。それは、この1行があります:私は、コードを実行するとRubyのFile.openが "そのようなファイルやディレクトリがありません - 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を教えてくれます。あなたはそれがあなたが思うところではないと思うでしょう。次に、ウィンドウのパス名を正しく指定していることを確認します。どのようにWindows用に適切なフォーマットのパス名ここではドキュメントを参照してください。

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

その後に応じてファイルにTEXT.TXTがある場所に作業ディレクトリを変更するDir.chdirを使用して、または絶対パス名を指定してのいずれか上記のIOドキュメントの説明を参照してください。それは

EDIT

あなたのスクリプト・ファイルの中のテキストファイルを入れている場合は、最も便利な1かもしれない第三のソリューションを追加しています...それを行う必要があります。

Dir.chdir(File.dirname(__FILE__)) 

これにより、現在の作業ディレクトリが、スクリプトを実行している.rbファイルと同じディレクトリに自動的に変更されます。

+0

で提案されているように使用できますC:\ Ruby192を見ていましたが、C:\ Ruby192 \ binにテキストファイルを置いていましたが、正しい場所に置いたら、それは魅力的でした。ありがとうございました! –

+3

@enraged camel:一般的には、テキストファイルを置くべきではありません。そこにファイルを置くほど、削除したくないファイルを削除する可能性が高くなります。 –

+0

ありがとう!背景のルビースクリプト... '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

また、 'File.open(File.expand_path(__ FILE__、' ...)は、https://github.com/travis-ci/travis-ci/issues/4656#issuecomment-131212402 –

2

ちょうどにあなたのコードを更新します。

2

次は、私はちょうど別の変形についてつまずい間違ったディレクトリであることに:

私は爆発File.open(my_file).each {|line| puts line}があったが、コマンドラインでlsの名前を示した(で、私が働いていたディレクトリ内にその名前の何かがありました)。私はFile.exists?(my_file) で奇妙なことにfalseを返して確認しました。説明: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) 
関連する問題