为什么File.exist找不到这个文件?

时间:2013-07-29 01:48:22

标签: ruby

我有一个像book_file_name这样的变量,它存储一个文件名,其路径如下:

 book_file_name
=> "./download/Access\\ Database\\ Design\\ \\&\\ Programming,\\ 3rd\\ Edition.PDF"

puts book_file_name
./download/Access\ Database\ Design\ \&\ Programming,\ 3rd\ Edition.PDF
=> nil

book_file_name.length
=> 71

当我使用File.exists?检查文件时,出了点问题。

这是我使用字符串的方式:

File.exists?("./download/Access\ Database\ Design\ \&\ Programming,\ 3rd\ Edition.PDF")
=> true

这是我使用变量的方式:

File.exists?(book_file_name)
=> false

变量出了什么问题?

2 个答案:

答案 0 :(得分:2)

字符串

 "./download/Access\ Database\ Design\ \&\ Programming,\ 3rd\ Edition.PDF"

是双引号,这会导致反斜杠+空格被替换为空格

这不会发生像book_file_name这样的字符串变量,并且不会发生在用单引号括起来的字符串中。

我可以看到带路径的实际书名是

' ./ download / Access Database Design&编程,第3版.PDF'

所以

File.exists?('./download/Access Database Design & Programming, 3rd Edition.PDF')
File.exists?("./download/Access Database Design & Programming, 3rd Edition.PDF")
book_file_name = './download/Access Database Design & Programming, 3rd Edition.PDF'
File.exists?(bookfilename)
book_file_name = "./download/Access Database Design & Programming, 3rd Edition.PDF"
File.exists?(bookfilename)

一切都会正常工作......所以你最好不要使用反斜杠。

答案 1 :(得分:0)

正如您在代码片段中所示,变量中包含的字符串中包含反斜杠。你不需要逃避空格,但如果你这样做,你只需要用一个反斜杠来逃避它们。就目前而言,你正在使用双反斜杠;第一个反斜杠逃脱了第二个,并且对空间没有影响。

puts "file name with spaces"
# => file name with spaces
puts "file\ name\ with\ spaces"
# => file name with spaces
puts "file\\ name\\ with\\ spaces"
# => file\ name\ with\ spaces

这解释了为什么你的字符串文字在变量失败的地方成功:两个字符串不相等。所以只需存储成功的相同字符串文字(带有单个反斜杠的字符串文字)或者没有任何反斜杠的字符串文字,你应该好好去。