如何在 OCaml 中列出给定扩展名的文件

How to list files of a given extension in OCaml

我想在 OCaml 中检索给定目录和给定扩展名的直接文件列表(即无递归搜索)。

我尝试了以下但是:

  1. 它看起来不像 OCaml-spirit
  2. 它不起作用(导入错误)
let list_osc2 = 
  let list_files = Sys.readdir "tests/osc2/expected/pp" in
  List.filter (fun x -> Str.last_chars x 4 = ".osc2") (Array.to_list list_files)

我收到错误(我正在使用 OCamlPro):

Required module `Str' is unavailable

谢谢

要使用 Str 模块,您需要 link 和 str library。比如ocamlc需要传str.cmaocamlopt需要传str.cmxa。我不知道如何用 OcamlPro 做到这一点。

无论如何,Str.last_chars在这里不是特别有用。如果文件名比后缀短,则不起作用。顺便说一下,您的代码永远不会匹配,因为 ".osc2" 是 5 个字符,永远不等于 last_chars x 4.

标准库中的Filename module具有提取和检查文件扩展名的功能。您不需要进行任何字符串操作。

我不知道你认为“丑陋得要命”是什么,但除了字符串操作错误外,我看不出你的代码有任何问题。枚举匹配项并过滤它们是完全惯用的。

let list_osc2 = 
  let list_files = Sys.readdir "tests/osc2/expected/pp" in
  List.filter (fun name -> check_suffix name ".osc2") (Array.to_list list_files)

您可以使用 Filename.extension 而不是 Str.last_chars:

let list_osc2 = 
  let list_files = Sys.readdir "tests/osc2/expected/pp" in
  List.filter (fun x -> Filename.extension x = ".osc2") (Array.to_list list_files)

然后使用管道运算符使其更具可读性:

let list_osc2 = 
  Sys.readdir "tests/osc2/expected/pp"
  |> Array.to_list
  |> List.filter (fun x -> Filename.extension x = "osc2")

不过我不知道您希望它在 OCamlPro 中如何工作,因为据我所知它没有文件系统。