我使用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进行操作?)?
答案 0 :(得分:5)
嗯,OCaml中有很多库可以处理http
协议,特别是网络通信。它们都不会提供类型string -> in_channel
的函数,因为in_channel
类型是OCaml拥有的抽象。该语言不允许我们创建自己的通道类型 1 的实现。
我知道并使用的库是:
据推测还有其他人,请随时编辑此答案并添加它们。
我个人更喜欢异步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 :(得分: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 下载?)?
没有