在用户的主目录中打开文件

时间:2017-01-11 15:51:05

标签: ocaml filenames ocaml-core

我使用Core.In_channel库遇到了一个奇怪的问题。这是一段用于在用户主目录中打开文件的代码

open Core.Std
In_channel.with_file "~/.todo_list" ~f:(fun in_c ->
  (* Do something here... *)
)

然而,在运行时,我得到的是:

Exception: (Sys_error "~/.todo_list: No such file or directory").

我绝对相信~/.todo_list存在,但我怀疑OCaml错误解释了文件名。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

正如其他人所说,~的扩展是由shell完成的,而不是由底层系统完成的。您对with_file的调用不涉及shell,因此该字符串按字面解释为文件名。

如果代码是代表已登录的用户运行的,则主目录可用作环境变量HOME的值。

# Unix.getenv "HOME";;
- : string = "/Users/username"

否则,您需要从用户数据库中提取主目录。

# let open Unix in (getpwnam "username").pw_dir;;
- : string = "/Users/username"