2017-01-11 18 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" 
関連する問題