我正在用C編寫程序,並且需要知道文件的MIME類型。在C程序中包含UNIX實用程序'文件'
我還沒有用谷歌搜索,我發現I must include the 'file' UNIX utility in my project。
file
的源代碼需要configure
和make
。我如何將其納入我的項目?我是否必須將部分源代碼剪裁成新的file.c
和file.h
?
我正在用C編寫程序,並且需要知道文件的MIME類型。在C程序中包含UNIX實用程序'文件'
我還沒有用谷歌搜索,我發現I must include the 'file' UNIX utility in my project。
file
的源代碼需要configure
和make
。我如何將其納入我的項目?我是否必須將部分源代碼剪裁成新的file.c
和file.h
?
是否想根據擴展名猜測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);
其他示例用法: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
@Mat謝謝。讓我意識到我遺漏了'magic_load'。 – 2012-02-05 21:24:24
感謝您的回答和評論。 – 2012-02-06 11:44:46
感謝您的回答和評論。
我解決了這一點:
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;
}
非常感謝! :)
「我需要知道文件的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
您需要比二進制更多的內容。文件使用/ etc/magic,其中包含各種文件類型的「指紋」。最好/最簡單的方法就是使用popen()或system()。 – wildplasser 2012-02-05 21:10:57
使用'popen'或'system'(總是)一個非常糟糕的主意。有'libmagic',或者如果你想調用'file(1)',你應該使用'posix_spawn'。 – 2012-02-05 23:16:41