我試圖使用libmagic和以下代碼來確定幾種型別的檔案的mime型別:
我試圖使用libmagic來確定幾種型別的檔案的mime型別。
auto handle = ::magic_open(MAGIC_MIME_TYPE)。
::magic_load(handle, NULL)。
//這兩種方法都失敗了,都有相同的錯誤。
//file_path是一個const char*,包含檔案的路徑。
auto type2 = ::magic_file(handle, file_path)。
//svg_content是一個std::vector<char>的檔案內容。
//auto type2 = ::magic_buffer(handle, svg_content.data(), svg_content.size() );
if(!type2)
{
std::cout << magic_error(handle) << std::endl;
}
::magic_close(handle)。
但是對于任何檔案或緩沖區,我都會收到regex錯誤,要么是或類似于:
46: regex error 17 for `(dryad-bibo/v)[0-9]. [0-9]', (match failed)
以這個.svg檔案為例:
<svg xmlns="http://www.w3.org/2000/svg"/span> id="flag-icon-css-no"/span> viewBox="0 0 640 480"/span>>
<path fill="#ed2939" d="M0 0h640v480H0z"/>
<path fill="#fff" d="M180 0h120v480H180z"/>
<path fill="#fff" d="M0 180h640v120H0z"/>
<path fill="#002664" d="M210 0h60v480h-60z"/>
<path fill="#002664" d="M0 210h640v60H0z"/>
</svg>。
到目前為止,我所嘗試的是:
。- libmagic 5.35
- libmagic 5.39
- libmagic 5.39
- libmagic 5.40
- libmagic 5.40
- libmagic來自 opensource.apple 。
- 將LC_TYPE和LANG設為 "C"
我正在與本地構建的libmagic版本進行鏈接,我在構建時有沒有遺漏什么?是否有任何呼叫是不正確的,或者有什么是我所遺漏的?
當我試圖運行本地編譯的相關檔案二進制檔案時,我得到了類似的錯誤。而當我使用默認提供的檔案命令時,我確實得到了影像/SVG xml作為輸出。
編輯
為了構建libmagic(適用于macOS和Ubuntu),我遵循以下步驟:
- 從Github下載相關版本 。
- autoreconf --install
- ./configure
- make
- make install
Update
看起來這個檔案底部的regex引起了問題(至少對svg來說):
https://github.com/file/file/blob/b56b58d499dbe58f2bed28e6b3c297fe7add992e/magic/Magdir/dataone
Update 2
發生了一些奇怪的事情;在我已經開始作業的系統上,magic_version()報告540,正如預期。但是在那些出現錯誤的系統上,magic_version()報告538。
這對我來說沒有什么意義,因為我在系統本身的任何地方都找不到這個版本,而當我在構建庫中運行 ./file --version 時,它報告說 file-5.40。
uj5u.com熱心網友回復:
在Ubuntu 20.04上測驗:
克隆 repo
git clone [email protected]:file/file.git
cd file/
在新克隆的 repo 中試試這個:
autoreconf -f -i
./configure --disable-silent-rules
make -j4
使-C測驗檢查
然后看看是否有任何錯誤報告。用make install安裝后,抓取一些有效的xml檔案,命名為 "test.xml",并把它和這個main.c一起放到某個檔案夾中:
#include <stdio.h>/span>
#include <magic.h>/span>
int main(void)
{
char *actual_file = "test.xml"/span>。
const char *magic_full。
magic_t magic_cookie。
/* MAGIC_MIME告訴magic回傳一個檔案的mime。
但你可以指定不同的東西 */ 。
magic_cookie = magic_open(MAGIC_MIME)。
if (magic_cookie == NULL) {
printf(" unable to initialize magic library
")。)
return 1;
}
printf("加載默認魔法資料庫
")。)
if (magic_load(magic_cookie, NULL) != 0) {
printf("無法加載魔法資料庫 - %s
", magic_error(magic_cookie))。
magic_close(magic_cookie)。
return 1。
}
magic_full = magic_file(magic_cookie, actual_file)。
printf("%s
", magic_full)。)
magic_close(magic_cookie)。
return 0。
(對vivithemage的禮遇。)
編譯并嘗試:
$ gcc main.c -lmagic
$ ./a.out
加載default魔法資料庫
text/xml; charset=us-ascii
如果它在您的系統上不作業,請在專案的bugtracker上報告bug,并說明您的作業系統和架構。您可以嘗試通過洗掉您在更新中發現的檔案中的違規記錄來熱修復您的問題。
uj5u.com熱心網友回復:
非常不滿意的答案,但它是針對GoogleTest的鏈接導致這個錯誤,甚至沒有運行任何測驗,只是針對它進行鏈接。
我改用Catch2代替,問題得到了解決。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/326085.html
標籤:
