打开可下载文件

Open a downloadable file

我使用 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
...

returns 一个错误 Fatal error: exception Sys_error("http://caml.inria.fr/distrib/ocaml-4.02/ocaml-4.02-refman.txt: No such file or directory")

有谁知道我可以使用哪个函数来打开这样一个可下载的文件?我是否必须先将其下载到本地(OCaml 如何做到这一点?)?

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

您必须先下载文件,使用 linux 包管理器中使用的常用下载工具之一 wget 或 curl。 Sys.command是你做这件事的朋友。

编写一个模块来检查文件名中是否有 "schema:" 之类的前缀,并采取适当的措施并不难。

也许看看 opam 来源以获得灵感?

好吧,OCaml 中有很多库可以处理特定的 http 协议和一般的网络通信。其中 None 将提供 string -> in_channel 类型的函数,因为 in_channel 类型是 OCaml 拥有的抽象。该语言不允许我们创建我们自己的通道类型 1 的实现。

我知道和使用的库是:

  1. cohttp - http 客户端和服务器的异步库;
  2. ocurl - 绑定到 libcurl;
  3. ocamlnet - 万物互联,甚至更多;

想必还有其他的,请随时编辑此答案并添加。

我个人更喜欢异步 monadic cohttp,但从 ocamlnet 开始更容易,这也是一个优秀的库,具有很多功能。这是在 OCaml 顶层中使用它的方法:

# #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创建它,但我怀疑是否有人会朝这个方向追求,不值得。

Does anyone know which function I could use to open such a downloadable file?

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

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

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

Do I have to first download it to local (how to do that by OCaml?)?

没有