File.exist?即使文件存在,也始终返回false

时间:2015-10-01 00:03:43

标签: ruby file

我有一个试图打开文件的程序:

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上运行它。

3 个答案:

答案 0 :(得分:0)

该代码有语法错误(&#34;如果&#34;不需要&#34;那么&#34;),你不必放&#34 ;;&#34;在每一行之后。

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

请记住,gets会添加一个新行字符,因此你需要做一个chomp,这种连接字符串的方式不会对ruby起作用。

答案 1 :(得分: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]
ziya@ziya:~/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

答案 2 :(得分: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支持使用;,但是当我们必须在一行上提供多个命令时,它们就可以使用了。我认为需要的 ONLY 时间是在使用Ruby在命令行执行单行命令时。在正常的脚本中,我从不在语句之间需要;

当我们使用单行then表达式时,

ifif一起使用,但是,我们会尾随if,从而无需then }。例如,这些完成相同的事情,但第二个是惯用的,更短的,更简洁,更容易阅读:

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

有关详细信息,请参阅“What is the difference between "if" statements with "then" at the end?”。

我们使用snake_case作为变量,而不是relPathabsPath,因此请使用rel_pathabs_path。 It_is_a_readability AndMaintenanceThing。

File.absolute_path(rel_path)是获取起始目录并返回给定相对目录的绝对路径的好方法。

File.foreach是一种非常快速的读取文件的方法,比使用File.read之类的方法更快速地进行扫描。它也是可扩展的,而File.read则不是。