我有一个试图打开文件的程序:
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 :(得分: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
表达式时, if
与if
一起使用,但是,我们会尾随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作为变量,而不是relPath
和absPath
,因此请使用rel_path
和abs_path
。 It_is_a_readability AndMaintenanceThing。
File.absolute_path(rel_path)
是获取起始目录并返回给定相对目录的绝对路径的好方法。
File.foreach
是一种非常快速的读取文件的方法,比使用File.read
之类的方法更快速地进行扫描。它也是可扩展的,而File.read
则不是。