我想使用Libextractor来获取文件的关键字/元数据。
它的基本示例是-
struct EXTRACTOR_PluginList *plugins
= EXTRACTOR_plugin_add_defaults (EXTRACTOR_OPTION_DEFAULT_POLICY);
EXTRACTOR_extract (plugins, argv[1],
NULL, 0,
&EXTRACTOR_meta_data_print, stdout);
EXTRACTOR_plugin_remove_all (plugins);
但是,这将调用函数EXTRACTOR_meta_data_print,将其“打印”到“ stdout”
我正在寻找一种将信息获取到另一个功能的方法-即将其传递或存储在内存中以进行进一步的工作。该文档对我来说还不清楚。有什么帮助或经验吗?
最佳答案
我尝试安装libextractor并使其无法正常工作(在调用EXTRACTOR_plugin_add_defaults()
时始终返回NULL插件指针),所以接下来我将写的内容未经测试:
来自:http://www.gnu.org/software/libextractor/manual/libextractor.html#Extracting
Function Pointer: int
(*EXTRACTOR_MetaDataProcessor)(void *cls,
const char *plugin_name,
enum EXTRACTOR_MetaType type,
enum EXTRACTOR_MetaFormat format,
const char *data_mime_type,
const char *data,
size_t data_len)
和
libextractor为找到的每个元数据项调用的函数的类型。
cls
closure (user-defined)
plugin_name
name of the plugin that produced this value;
special values can be used (i.e. '<zlib>' for
zlib being used in the main libextractor library
and yielding meta data);
type
libextractor-type describing the meta data;
format basic
format information about data
data_mime_type
mime-type of data (not of the original file);
can be NULL (if mime-type is not known);
data
actual meta-data found
data_len
number of bytes in data
Return 0 to continue extracting, 1 to abort.
因此,您只需要编写自己的函数即可,该函数的名称如下:
int whateveryouwant(void *cls,
const char *plugin_name,
enum EXTRACTOR_MetaType type,
enum EXTRACTOR_MetaFormat format,
const char *data_mime_type,
const char *data,
size_t data_len)
{
// Do your stuff here
if(stop)
return 1; // Stops
else
return 0; // Continues
}
并通过以下方式调用:
EXTRACTOR_extract (plugins, argv[1],
NULL, 0,
&whateveryouwant,
NULL/* here be dragons */);
如http://www.gnu.org/software/libextractor/manual/libextractor.html#Generalities“ 3.3 libextractor库简介”中所述
[这里是小龙]:这是留给用户使用的参数(即使这样重复也是多余的)。按照文档中的定义:“对于找到的每个元数据项,GNU libextractor都会调用proc函数,并将proc_cls作为第一个参数传递给proc。”
其中“
proc
函数”是您添加的函数(此处为whateveryouwant()
),而proc_cls
是用于将数据传递给该函数的任意指针(可以是任何指针)。类似于示例中指向stdout
的指针,以便打印到stdout
。话虽这么说,我怀疑该函数写入FILE *而不是不可避免地写入stdout
;因此,如果您打开一个文件进行写入,并将其“文件描述符”作为最后一个EXTRACTOR_extract()
参数传递,则可能会以一个文件填充了当前在屏幕上可以读取的信息作为结尾。那不是访问信息的适当方法,但是如果您正在寻找一种快速而肮脏的方法来测试某些行为或某些功能;可以做到这一点,直到您编写适当的功能。祝您的代码好运!