如何将文件下载/写入某个目录?

时间:2013-09-17 18:18:15

标签: ruby file-io

如何指定下载目录?我试过这个:

open("D:\Downloads" + filename, 'wb') do |io|
  response.read_body do |chunk|
    io.write chunk
  end
end

但它不起作用。我甚至不知道文件的加载目录。

2 个答案:

答案 0 :(得分:1)

引用你的路径。另外我认为你需要添加另一个\

open("D:\\Downloads\\" + filename, 'wb') do |io|
  response.read_body do |chunk|
    io.write chunk
  end
end

答案 1 :(得分:0)

利用文件类对splitjoin路径的能力:

open(File.join("D:/Downloads", filename), 'wb')

joinsplit了解路径分隔符并为您做正确的事。

例如:

filename = 'foo'

"D:\Downloads" + filename # => "D:Downloadsfoo"
File.join("D:\Downloads", filename) # => "D:Downloads/foo"

使用Ruby,没有必要在Windows上的文件名中使用反斜杠(反斜杠)。 Ruby足够聪明,知道代码在Windows上运行,并在必要时自动从正斜杠转换为反斜杠。

请参阅IO documentation

  如果可能,Ruby将在不同的操作系统约定之间转换路径名。例如,在Windows系统上,文件名“/gumby/ruby/test.rb”将打开为“\ gumby \ ruby​​ \ test.rb”。在Ruby字符串中指定Windows样式的文件名时,请记住转义反斜杠:

"c:\\gumby\\ruby\\test.rb"
  

我们这里的例子将使用Unix风格的正斜杠; File :: ALT_SEPARATOR可用于获取特定于平台的分隔符。

现在,请查看上面使用File.join的示例代码。您正在使用"D:\Downloads"转换为D:Downloads,因为Ruby的双引号字符串解释\D是为了尝试逃避错误中的D。因此,Ruby删除了导致"D:Downloads"的单个反斜杠,使您希望成为相对路径的绝对路径,在运行代码时,该路径将以当前目录为根。意识到你不需要使用反斜杠可以完全解决这个问题,这样你就可以编写"D:/Downloads"并让你和Ruby感到高兴。

或者,您可以使用像'D:\Downloads'这样的单引号,Ruby会很乐意接受并理解为D:\\Downloads,但是,再一次,鉴于上述知识,您不必乱用反斜杠,使它成为一个没有实际意义的点。

Backslashes in single quoted strings vs. double quoted strings”对您来说是一个很好的补充阅读。