打开可下载的文件

时间:2016-06-15 19:16:13

标签: ocaml

我使用open_in打开一个带有路径的本地文件:

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进行操作?)?

3 个答案:

答案 0 :(得分:5)

嗯,OCaml中有很多库可以处理http协议,特别是网络通信。它们都不会提供类型string -> in_channel的函数,因为in_channel类型是OCaml拥有的抽象。该语言不允许我们创建自己的通道类型 1 的实现。

我知道并使用的库是:

  1. cohttp - http客户端和服务器的异步库;
  2. ocurl - 对libcurl的绑定;
  3. ocamlnet - 所有网络甚至更多;
  4. 据推测还有其他人,请随时编辑此答案并添加它们。

    我个人更喜欢异步monadic cohttp,但更容易从ocamlnet开始,这也是一个很棒的库,具有很多功能。这是如何在OCaml toplevel中使用它:

    # #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
    

    <强>脚注:

    1. 至少在纯OCaml中,可以用C创建它,但我怀疑是否有人会朝这个方向努力,它不值得。

答案 1 :(得分:1)

在Ocaml中,这是一个C fopen调用,无法使用http源方案。

您必须首先下载该文件,使用一般的下载工具wget或curl,它们也在您的linux包管理器中使用。 Sys.command是你做这件事的朋友。

编写一个检查&#34;架构的文件名的模块并不太难:&#34;喜欢前缀,并采取适当的行动。

也许看看opam的灵感来源?

答案 2 :(得分:0)

<块引用>

有谁知道我可以使用哪个函数来打开这样一个可下载的文件?

为您的 Linux 发行版安装 wget 程序并在编译时使用 Unix 库,您可以使用:

let open_url_in = Unix.open_process_in("wget -O - " ^ url)

这会运行带有 wget-O o 程序,要求它将下载的文件输出到 stdout,open_process_in 作为结果通道读入您的进程。

<块引用>

我是否必须先将其下载到本地(如何通过 OCaml 下载?)?

没有