2015-10-01 43 views
1

我有試圖打開一個文件的程序:File.exist?始終返回false,即使文件不存在

Dir.chdir(File.dirname(__FILE__)) 
puts "Enter file name: "; 
relPath = gets; 
absPath = Dir.pwd << "/" << relPath; 
if File.exist?(absPath) then 
    puts "File exists"; 
    file = File.open(absPath, "r"); 
    other code... 
else 
    puts "File does not exist"; 
end 

它總是打印「文件不存在」,即使當前目錄存在並且文件也存在。該文件和腳本位於相同的目錄中。

我在Mac OS X Yosemite(10.10.3)和Ruby 2.2.0p0上運行它。

+0

'if' *可以*有'then'。 ';'不是慣用的,但Ruby允許它。這篇文章寫得不好,但不同。 –

+0

我是ruby的新手,我通常使用Java和JavaScript。 – flizana

回答

0

我無法解釋爲什麼(雖然我堅信它是用於某些空白字符),但是這個小小的貢獻確實起作用。

Dir.chdir(File.dirname(__FILE__)) 
print "Enter file name:"; 
relPath = gets.chomp; #intuitively used this, and it wroked fine 
absPath = File.expand_path(relPath) #used builtin function expand_path instead of string concatenation 
puts absPath 
puts File.file?(absPath) 
if File.exist?(absPath) then 

    puts "File exists"; 
    puts File.ctime(absPath) #attempting a dummy operation :) 

else 
    puts "File does not exist"; 
end 

捉迷藏代碼

$ ls -a anal* 
analyzer.rb 
$ ruby -v 
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] 
[email protected]:~/Desktop/code/ruby$ ruby fileexists.rb 
Enter file name:analyzer.rb 
/home/ziya/Desktop/code/ruby/analyzer.rb #as a result of puts absPath 
true #File.file?(absPath) => true 
File exists 
2015-06-11 12:48:31 +0500 
+0

這是'gets.chomp'行做的伎倆。謝謝! – flizana

+1

'gets'返回'「\ n」'(換行符)作爲字符串的一部分。因此,使用'chomp'去除了額外的字符。如果該文件夾不相對於'Dir.pwd',我也會考慮使用'File.join'。 – Myst

+0

btw,'File.join'比'File.expand_path'更明確。後者有自己的魔力,但第一個至少需要兩個非常清楚地描述過程的論點。我應該使用它。 – marmeladze

0

該代碼有語法錯誤(「如果」不需要「那麼」),你不必把「;」每行後。

嘗試

Dir.chdir(File.dirname(__FILE__)) 
puts "Enter file name: " 
relPath = gets 
absPath = "#{Dir.pwd}/#{relPath.chop}" 
if File.exist?(absPath) 
    puts "File exists" 
    file = File.open(absPath, "r") 
else 
    puts "File does not exist" 
end 

記住,獲取將增加一個新的行字符,所以你需要做一個格格,和這種方式來連接字符串將無法在紅寶石工作。

+1

你可以考慮使用'File.join Dir.pwd,relPath.chop'(或'File.expand_path(relPath。chomp)'),以便在Windows和Unix上兼容。 – Myst

0

你的代碼是不地道的紅寶石。儘管Ruby支持使用;

Dir.chdir(File.dirname(__FILE__)) 

puts 'Enter file name: ' 
rel_path = gets.chomp 
abs_path = File.absolute_path(rel_path) 

if File.exist?(abs_path) 

    puts 'File exists' 
    File.foreach(abs_path) do |line| 
    # process the line 
    end 

else 
    puts 'File does not exist' 
end 

,他們使用的時候,我們絕對必須在一行中提供多個命令:我會寫這樣的未經測試的代碼。 只有我可以想到需要使用Ruby在命令行執行單行命令。在正常的腳本中,我從來不需要在語句之間使用;

then是當我們使用一個單一的線if表達,然而,我們已經尾隨if這消除了then有必要與if使用。例如,這些完成同樣的事情,但第二個是地道的,短,更簡潔,更易於閱讀:

if true then a = 1 end 
a = 1 if true 

請參閱「What is the difference between "if" statements with "then" at the end?」的詳細信息。

而不是relPathabsPath我們使用snake_case變量,所以使用rel_pathabs_path。它是可讀性和維護性。

File.absolute_path(rel_path)是一種很好的方式,可以取出起始目錄並返回給定相對目錄的絕對路徑。

File.foreach是一種讀取文件的快速方式,比使用類似File.read的文件更快。它也是可擴展的,而File.read則不是。