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或curl
Sys.command
是您的朋友

编写一个模块来检查文件名是否有类似于“schema:”的前缀,并采取适当的操作并不难


也许可以从opam源代码中寻找灵感?

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

我知道和使用的图书馆有:

  • -用于http客户端和服务器的异步库
  • -与libcurl的绑定
  • -万物联网,甚至更多 可能还有其他答案,请随意编辑并添加

    我个人更喜欢异步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
    

    脚注:

  • 至少在纯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已经具备了您想要的功能。不需要使用其他库。