2012-02-05 9 views
0

私はCでプログラムを書いています。私はファイルのMIMEタイプを知る必要があります。はCプログラムのUNIXユーティリティ 'file'を含んでいます

Googleで検索したところ、I must include the 'file' UNIX utility in my projectが見つかりました。

ソースコードfileは、configuremakeが必要です。プロジェクトにどのように含めることができますか?ソースコードの一部を新しいfile.cfile.hにトリミングする必要がありますか?

+0

"私はファイルのMIMEタイプを知る必要があります" - >可能な複製http://stackoverflow.com/questions/9137732/how-to-generate-the-http-content-type-header -in-c/9137758、私はhttp://stackoverflow.com/a/9137758/960195として回答しました –

+0

バイナリ以上のものが必要です。 Fileは/ etc/magicを使用します。このファイルにはさまざまなファイルタイプの「フィンガープリント」が含まれています。ベスト/シンプルな方法は単にpopen()またはsystem()を使うことです。 – wildplasser

+0

'popen'や' system'を使うのは(いつも)とても悪い考えです。 'libmagic'があります。もし' file(1) 'を起動したいのであれば、' posix_spawn'を使うべきです。 –

答えて

6

拡張子に基づいてMIMEタイプを推測するか、fileのような処理を行い、ヘッダーを調べますか?

fileと同様の機能を使用するには、fileをプロジェクトに含める必要はありません。代わりに、fileが基づいているlibmagicを使用したいと思うでしょう。残念なことに、私はこれに関するドキュメントの良いソースを知らないが、それはかなり簡単です。

magic_t magic = magic_open(MAGIC_MIME_TYPE); 
magic_load(magic, NULL); 
char *mime_type = magic_file(magic, "/path/to/file"); 
magic_close(magic); 
+1

他の使用例:http://stackoverflow.com/questions/2105816/trying-to-use-include-compile-3rd-party-library-libmagic-c-file-ype-detect – Mat

+0

@Matありがとうございます。私は 'magic_load'を省きました。 –

+0

あなたの回答とコメントに感謝します。 –

0

ご回答ありがとうございます。

私はこれで解決:

const char *w_get_mime(const char *arg, const char *file, int line_no) 
{ 

    const char *magic_full; 
    magic_t magic_cookie; 

    if(arg == NULL) 
     w_report_error("called with NULL argument.",file,line_no,__func__,0,1,error); 
    else if ((magic_cookie = magic_open(MAGIC_MIME)) == NULL) 
     report_error("unable to initialize magic library.",0,1,error); 
    else if (magic_load(magic_cookie, NULL) != 0) 
    { 
     magic_close(magic_cookie); 
     snprintf(globals.err_buff,MAX_BUFF,"cannot load magic database - %s .",magic_error(magic_cookie)); 
     report_error(globals.err_buff,0,1,error); 
    } 
    magic_full = magic_file(magic_cookie, arg); 
    magic_close(magic_cookie); 
    return magic_full; 
} 

おかげでたくさん! :)

関連する問題