大多数语言都没有这个,所以我会很惊讶在 OCaml 中找到它。Apache 用一个mime.types
文件来做这件事——你可以在那里寻找提示。这是最常用的方式 - 一个将扩展映射到 mimetype 的巨大表。您可以轻松地在 OCaml 中实现它:
let mimetype_of_extension = function
| "txt" | "log" -> "text/plain"
| "html" | "htm" -> "text/html"
| "zip" | "application/zip"
...
另一种方法是查看文件内容,但您基本上需要了解各种文件格式。
也就是说,它对您没有多大帮助,因为所有语言的源文件通常都被视为text/plain
. 它们无法通过 mimetype 区分;因此我真的不知道你的get_language_from_mime_type
功能是做什么的。
然而,各种源文件的文件扩展名或多或少是标准化的,所以如果你知道扩展名,你就会知道语言。获取扩展名就像从文件名中提取最后一个句点之后的任何内容一样简单。
let extension_of_filename filename =
let pos = (String.rindex filename '.') + 1 in
let len = String.length filename in
let ext = String.create (len - pos) in
String.blit filename pos ext 0 (len - pos);
ext;;
好吧,至少在除了 Brainfuck 和 OCaml 之外的任何语言中都很简单。之后,就很简单了——“c”是一个 C 程序,“h”也是;“ml”是 OCaml;等等