2016-06-15 5 views
2

:今を開き、私はそのパスを使用してローカルファイルを開くために<code>open_in</code>を使用するダウンロード可能なファイル

let f = open_in "/Users/SoftTimur/file.txt" in 
... 

を、私はそのURLでダウンロード可能なファイルを開きたい:

let f = open_in "http://caml.inria.fr/distrib/ocaml-4.02/ocaml-4.02-refman.txt" in 
... 

はエラーを返します。 Fatal error: exception Sys_error("http://caml.inria.fr/distrib/ocaml-4.02/ocaml-4.02-refman.txt: No such file or directory")

ダウンロード可能なファイルを開くためにどの機能を使用することができますか?最初にローカルにダウンロードする必要がありますか(OCamlでこれを行う方法?)

答えて

5

特に、httpプロトコルを扱うことができるOCamlには、ネットワーク通信の一般的なライブラリがたくさんあります。 in_channelタイプはOCamlが所有する抽象であるため、それらのタイプのいずれもタイプstring -> in_channelの機能を提供することはありません。この言語では、チャンネルタイプの独自の実装を作成することはできません。私が知っているし、使用することを

ライブラリは、以下のとおりです。

  1. cohttp - HTTPクライアントとサーバーのための非同期ライブラリ。
  2. ocurl - libcurlへのバインディング。
  3. ocamlnet - すべてのものがネットワークになります。

おそらく他にもこの回答を編集して追加してください。

私は個人的には非同期モナディックcohttpが好きですが、多くの機能を備えた優れたライブラリでもあるocamlnetで始める方が簡単です。

# #use "topfind" 
# #require "netclient"; 
# module Client = Nethttp_client.Convenience 
# let ocamldoc = Client.http_get "http://caml.inria.fr/distrib/ocaml-4.02/ocaml-4.02-refman.txt";; 

再生を開始する前に、あなたは

opam install ocamlnet 

脚注でそれをインストールしていることを確認してください:

    これはOCamlのトップレベルでそれを再生する方法であります
  1. 少なくとも純粋なOCamlでは、それをCから作成することは可能ですが、誰かがこのディレクトリで追求するかどうかは疑問ですそれは価値がない。
+0

ありがとうございます...1つの問題は、すべてのOCamlコードをJSコードに 'js_of_ocaml'で転送することです。私は 'ocamlnet'の解決策を試しました、' js_of_ocaml'で、それはたくさんのプリミティブを逃しました... – SoftTimur

+2

あなたのための唯一の選択は 'cohttp + lwt'です – ivg

+0

私は' ttファイル上で 'cohttp + lwt'を実行することに成功しました'http://'で置き換えます。しかし、私の生成したテキストファイルは一般的には[blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob)で始まり、 'cohttp + lwt'はこのスキーマをサポートしていないようです。 – SoftTimur

1

Ocamlでは、これはCのfopen呼び出しであり、httpソーススキームでは実行できません。

Linuxのパッケージマネージャーでも使用されている通常のダウンロードツールwgetまたはcurlを使用して、まずファイルをダウンロードする必要があります。これを行うにはSys.commandがあなたの友人です。

接頭辞のような「スキーマ:」のファイル名をチェックし、適切な処置をとるモジュールを作成するのはあまり難しくありません。

多分、インスパイアのためのオパームのソースを見ますか?

関連する問題