2012-02-05 68 views
0

我正在用C編寫程序,並且需要知道文件的MIME類型。在C程序中包含UNIX實用程序'文件'

我還沒有用谷歌搜索,我發現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 – 2012-02-05 21:07:02

+0

您需要比二進制更多的內容。文件使用/ etc/magic,其中包含各種文件類型的「指紋」。最好/最簡單的方法就是使用popen()或system()。 – wildplasser 2012-02-05 21:10:57

+0

使用'popen'或'system'(總是)一個非常糟糕的主意。有'libmagic',或者如果你想調用'file(1)',你應該使用'posix_spawn'。 – 2012-02-05 23:16:41

回答

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-c-filetype-detect – Mat 2012-02-05 21:15:09

+0

@Mat謝謝。讓我意識到我遺漏了'magic_load'。 – 2012-02-05 21:24:24

+0

感謝您的回答和評論。 – 2012-02-06 11:44:46

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; 
} 

非常感謝! :)