Ocaml 打开可下载的文件
我在中使用Ocaml 打开可下载的文件,ocaml,Ocaml,我在中使用open\u打开本地文件及其路径: 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 ... 返回错误致命错误:异常系统错误(“http://caml.inria.fr/distrib/ocaml-4.02/ocaml-4.
open\u打开本地文件及其路径:
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
...
返回错误致命错误:异常系统错误(“http://caml.inria.fr/distrib/ocaml-4.02/ocaml-4.02-refman.txt: 没有这样的文件或目录“
有人知道我可以用哪个函数打开这样一个可下载的文件吗?我是否必须首先将其下载到本地(如何通过OCaml做到这一点?在OCaml中,这是一个C fopen调用,无法使用http源代码方案实现
您必须首先下载该文件,使用linux包管理器中使用的常用下载工具wget或curlSys.command
是您的朋友
编写一个模块来检查文件名是否有类似于“schema:”的前缀,并采取适当的操作并不难
也许可以从opam源代码中寻找灵感?好吧,OCaml中有很多库可以处理http
协议以及一般的网络通信。它们都不会提供类型为string->in\u channel
的函数,因为in\u channel
类型是OCaml拥有的抽象。该语言不允许我们创建自己的通道类型1实现
我知道和使用的图书馆有:
-用于http客户端和服务器的异步库李>
-与libcurl的绑定李>
-万物联网,甚至更多李>
可能还有其他答案,请随意编辑并添加
我个人更喜欢异步monadiccohttp
,但从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
脚注:
至少在纯OCaml中,可以从C创建它,但我怀疑是否有人会朝这个方向努力,这不值得
有人知道我可以用哪个函数打开这样一个可下载的文件吗
为Linux发行版安装wget
程序,并在编译时使用Unix
库,您可以使用:
let open_url_in = Unix.open_process_in("wget -O - " ^ url)
这将运行带有-O
的wget
程序,要求它将下载的文件输出到stdout,stdout将中的open\u process\u作为结果通道读入进程
我是否必须首先将其下载到本地(如何通过OCaml实现这一点?)
不需要。谢谢您的帮助。。。一个问题是,我将通过JS\u of_OCaml
将所有OCaml代码传输到JS代码。我尝试了ocamlnet
的解决方案,使用js\u of_ocaml
,它错过了很多原语…然后您唯一的选择是cohttp+lwt
我成功地在一个以http://
启动的txt文件上运行cohttp+lwt
。然而,我生成的文本文件通常以开头,似乎cohttp+lwt
不支持此模式。而且,ocaml文件上的js_of_ocaml
返回了许多缺少的原语,例如lwt_libev_init
,lwt_libev_io_stop
,lwt\u unix\u blit
。\u ocaml的js\u已经具备了您想要的功能。不需要使用其他库。