2017-01-11 10 views
0

У меня возникла странная проблема с использованием библиотеки 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.

Что мне здесь не хватает?

+2

'~' специально для оболочки Unix, где оболочка будет автоматически расширять их. Проверьте модуль ocaml на то, как развернуть '~' до полного пути пользователя. – mootmoot

+0

Да, вот что я подумал. Я изучаю это прямо сейчас. – RichouHunter

ответ

2

Как уже говорилось, расширение ~ осуществляется оболочкой, а не базовой системой. Никакая оболочка не участвует в вашем вызове with_file, поэтому строка интерпретируется буквально как имя файла.

Если код работает от имени пользователя, который вошел в систему, домашний каталог доступен как значение переменной окружения HOME.

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

В противном случае вам нужно будет извлечь домашний каталог из базы данных пользователей.

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