我有一个像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
变量出了什么问题?
答案 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
这解释了为什么你的字符串文字在变量失败的地方成功:两个字符串不相等。所以只需存储成功的相同字符串文字(带有单个反斜杠的字符串文字)或者没有任何反斜杠的字符串文字,你应该好好去。