Gtk 确定文件的mime类型

Gtk 确定文件的mime类型,gtk,ocaml,mime-types,gtksourceview,Gtk,Ocaml,Mime Types,Gtksourceview,如何确定文件的mime类型(在OCaml中) 我正在尝试设置GtkSourceView控件的语言,但要做到这一点,我需要首先确定语言。我能看到的唯一方法是使用mime类型-有一个函数将返回正确的语言,如下所示: GSourceView.source_languages_manager#get_language_from_mime_type : string -> source_language option 我真的不想把这种语言硬编码到我的源代码中。如果无法在OCaml中确定mime类型

如何确定文件的mime类型(在OCaml中)

我正在尝试设置GtkSourceView控件的语言,但要做到这一点,我需要首先确定语言。我能看到的唯一方法是使用mime类型-有一个函数将返回正确的语言,如下所示:

GSourceView.source_languages_manager#get_language_from_mime_type : string -> source_language option

我真的不想把这种语言硬编码到我的源代码中。如果无法在OCaml中确定mime类型(在搜索文档后,我还没有找到一种方法),是否有其他方法可以确定源语言?

大多数语言都缺少这种方法,因此在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来区分;因此,我真的不知道你的
从mime类型中获取语言的功能是什么

但是,各种源文件的文件扩展名或多或少都是标准化的,因此,如果您知道扩展名,您将了解该语言。获取扩展名非常简单,只要从文件名中删除最后一个句点之后的内容即可

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;等等。

在研究了包含此功能的gedit源代码后,我发现了一种glib方法,可以为我实现这一点。提供了
g\u file\u info\u get\u content\u type()
方法的示例使用。还有一种方法,glib中也有


不幸的是,这些函数还没有包装,这意味着我可能必须为它们生成自己的包装。

在GTK中,您可以包装已经找到的函数


解析
/etc/mime.types
也不难——它是一个简单的空格分隔文件。我相信Ocsigen和Ocamlnet都包含这样做的代码,但我不知道它们是否使访问变得容易(例如,Ocamlnet
netstring
库公开的函数)。

这可能不是确定源代码类型的最佳方法(使用/etc/mime.types最适合该IMO),但是您也可以使用。

OP已经依赖于GtkSourceView,因此他可能需要一个函数,该函数返回由GtkSourceView或其依赖项之一安装的…/share/mime/types中列出的类型。该文件列出了“text/x-erlang”、“text/x-eiffel”等(仅通过“e”):但该文件中没有列出这些类型的规范扩展名。我认为从mime类型获取语言是为了最终从一个配置文件eiffel.lang、erlang.lang…获取语法描述(突出显示…)。。。在…/share/gtksourceview-2.0/language specs/@PascalCuoq中-您的权利,这些是我要查找的mime类型-这是否意味着我必须自己创建一个大的查找表,并根据文件扩展名返回mime类型?抱歉,我不熟悉gtksourceview。如果您已经有一个文件,比如@Pascal descripes,那么您可以创建一个例程来解析它,而不是自己创建一个查找表。