0

我有一个变量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

变量有什么问题?

4

2 回答 2

2

字符串

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

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

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

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

'./download/Access 数据库设计与编程,第 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)

一切都会很好......所以你最好不要使用反斜杠。

于 2013-07-29T03:27:21.473 回答
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

这解释了为什么你的字符串文字在你的变量失败的地方成功:这两个字符串不等价。因此,只需存储成功的相同字符串文字(带有单个反斜杠的字符串)或不带任何反斜杠的字符串文字,您应该很高兴。

于 2013-07-29T02:01:19.793 回答