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を呼び出し、関数EXTRACTOR_meta_data_printを「stdout」に「出力」します。この情報を別の関数に取得する方法を検討しています。つまり、これをメモリに渡すか、保存してさらに作業します。ドキュメントは私には明確ではありませんでした。これに関するヘルプや経験はありますか?

4

1 に答える 1

2

libextractor をインストールしようとしましたが、動作しませんでした ( への呼び出し時に常に NULL プラグイン ポインターを返しますEXTRACTOR_plugin_add_defaults()) 。

から: 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。そうは言っても、関数は必然的にstdout;ではなく FILE* に書き込むのではないかと思います。したがって、書き込み用にファイルを開き、その「ファイル記述子」を lastEXTRACTOR_extract()のパラメーターとして渡すと、現在画面で読み取ることができる情報で満たされたファイルで終了する可能性があります。それは情報にアクセスするための適切な方法ではありませんが、何らかの動作や機能をテストするための簡単で汚い方法を検討している場合は、適切な関数を作成するまでは、それが可能です。

あなたのコードで頑張ってください!

于 2012-12-11T01:14:16.903 に答える