1

我想使用 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”。我正在寻找一种将这些信息传递给另一个函数的方法——即将它传递或存储在内存中以供进一步工作。我不清楚文档。对此有任何帮助或经验吗?

4

1 回答 1

2

我尝试安装 libextractor 并未能使其正常工作(它总是在调用时返回一个 NULL 插件指针EXTRACTOR_plugin_add_defaults()),所以我接下来要写的不是 TESTED

来自: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 库简介”中所述

[here be dragons]:这是一个留给用户使用的参数(即使这样说是多余的)。如文档中所定义:“对于找到的每个元数据项,GNU libextractor 将调用 'proc' 函数,将 'proc_cls' 作为第一个参数传递给 'proc'。”

其中“proc函数”是您添加的函数(whateveryouwant()此处)并且proc_cls是任意指针(可以是任何指针),您可以将数据传递给函数。就像示例中的指针一样stdout,为了打印到stdout. 话虽如此,我怀疑该函数写入 FILE* 而并非不可避免地写入stdout; 因此,如果您打开一个文件进行写入,并将其“文件描述符”作为 lastEXTRACTOR_extract()的参数传递,您可能会以一个填充了您当前可以在屏幕上读取的信息的文件结束。这不是访问信息的正确方法,但是如果您正在寻找一种快速而肮脏的方法来测试某些行为或某些功能;可以做到这一点,直到你编写一个适当的函数。

祝你的代码好运!

于 2012-12-11T01:14:16.903 回答