Ruby中使用CSV.open(filename, "w")打开文件时,若目标文件不存在会自动创建吗?
明确结论
你写的CSV.open(filename, "w") do |csv| 调用,只要路径满足运行前提就会自动创建不存在的同名目标文件,这个行为和Ruby原生的文件打开逻辑完全一致,没有额外做特殊处理。
实际运行的行为边界
- 满足自动创建的前提:你传入的
filename路径里,所有上级目录都已经存在,且当前运行进程对该目录有写入权限:- 目标文件不存在时:直接生成一个空的同名文件,后续写入的内容会直接落到这个新文件里
- 目标文件已经存在时:不会提示文件已存在,会直接把原文件的所有内容清空,准备写入新内容
- 无法自动创建、会直接抛错的场景:
- 传入的路径里有某一级父目录不存在:这个方法不会帮你递归创建缺失的文件夹,会直接抛出
Errno::ENOENT异常,这是实际开发中最容易踩的坑 - 当前进程没有路径对应的写入权限,或者
filename指向的本身就是一个文件夹而非普通文件:会抛出对应的权限、文件类型类异常
- 传入的路径里有某一级父目录不存在:这个方法不会帮你递归创建缺失的文件夹,会直接抛出
实用补充提示
- 你现在用的块式写法,会在块内代码全部执行完之后自动关闭打开的文件句柄,不需要手动写
csv.close,不会出现句柄泄漏的问题 - 如果不想不小心覆盖已有文件,可以把打开模式换成
"x",这个模式的特性是:只有目标文件不存在时才会新建,一旦文件已存在就直接抛错停止执行 - 如果需要自动连带创建缺失的父目录,要在调用
CSV.open之前,手动用FileUtils.mkdir_p把文件所在的目录结构建好,再执行CSV打开操作
内容的提问来源于stack exchange,提问作者Taylor Dorsett
相关产品推荐
相关产品推荐

