如何在 Ruby 中指定要写入和读取的文件位置?

How can I specify the file location to write and read from in Ruby?

所以,我有一个函数可以创建一个指定用户数据的对象。然后,使用 Ruby YAML gem 和一些代码,我将对象放入 YAML 文件并保存。这会将 YAML 文件保存到 Ruby 脚本来自 运行 的位置。我怎样才能告诉它保存到某个文件目录? (简化版)我的代码是这样的

print "Please tell me your name:  "
$name=gets.chomp
$name.capitalize!
print "Please type in a four-digit PIN number:  "
$pin=gets.chomp

我还有一个函数强制 pin 为四位整数,但这并不重要。

然后,我将其添加到一个对象中

new_user=Hash.new (false)
new_user["name"]=$name
new_user["pin"]=$pin

然后将其添加到 YAML 文件中并保存。如果 YAML 文件不存在,则会创建一个。它在与脚本 运行 相同的文件目录中创建它。有没有办法更改保存位置? 将对象保存到 YAML 文件的脚本是这样的。

def put_to_yaml (new_user)
File.write("#{new_user["name"]}.yaml", new_user.to_yaml)
end
put_to_yaml(new_user)

最终,问题是:如何更改文件的保存位置?当我再次加载它时,如何告诉它从哪里获取文件?

感谢您的帮助

您提供的是部分路径名(只是一个文件 名称),所以我们从当前目录读取和写入。因此你有两个选择:

  • 提供完整的绝对路径名(就个人而言,我喜欢为此使用路径名 class);或

  • 先改变当前目录(用Dir.chdir

目前,当您使用 File.write 时,它会获取您当前的工作目录,并将文件名附加到该位置。尝试:

puts Dir.pwd #  Will print the location you ran ruby script from.

如果每次都写在特定位置可以指定绝对路径:

File.write("/home/chameleon/different_location/#{new_user["name"]}.yaml")

或者您可以指定当前工作目录的相对路径:

# write one level above your current working directory
File.write("../#{new_user["name"]}.yaml", new_user.to_yaml)

您还可以指定 relative 到您当前正在执行的 ruby 文件:

file_path = File.expand_path(File.dirname(__FILE__))
absolute_path = File.join(file_path, file_name)
File.write(absolute_path, new_user.to_yaml)