如何在 OCaml 中列出给定扩展名的文件
How to list files of a given extension in OCaml
我想在 OCaml 中检索给定目录和给定扩展名的直接文件列表(即无递归搜索)。
我尝试了以下但是:
- 它看起来不像 OCaml-spirit
- 它不起作用(导入错误)
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.cma
,ocamlopt
需要传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 中如何工作,因为据我所知它没有文件系统。
我想在 OCaml 中检索给定目录和给定扩展名的直接文件列表(即无递归搜索)。
我尝试了以下但是:
- 它看起来不像 OCaml-spirit
- 它不起作用(导入错误)
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.cma
,ocamlopt
需要传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 中如何工作,因为据我所知它没有文件系统。