尝试使用第三部分库 libmagic
Posted
技术标签:
【中文标题】尝试使用第三部分库 libmagic【英文标题】:trying to use 3rd part library, libmagic 【发布时间】:2013-01-23 01:02:33 【问题描述】:我尝试使用此代码:
#include <stdio.h>
#include <magic.h>
int main(void)
char *actual_file = "/file/you/want.yay";
const char *magic_full;
magic_t magic_cookie;
magic_cookie = magic_open(MAGIC_MIME);
if (magic_cookie == NULL)
printf("unable to initialize magic library\n");
return 1;
printf("Loading default magic database\n");
if (magic_load(magic_cookie, NULL) != 0)
printf("cannot load magic database - %s\n", magic_error(magic_cookie));
magic_close(magic_cookie);
return 1;
magic_full = magic_file(magic_cookie, actual_file);
printf("%s\n", magic_full);
magic_close(magic_cookie);
return 0;
执行此代码时,会出现消息:“无法加载魔法数据库”。为什么?我不明白是什么原因……。
我使用 Visual Studio 2010 进行编译,没有任何构建错误。
【问题讨论】:
你的代码中没有任何东西是 C++,都是 C。 关于错误,请给出full错误信息,代码会从库中打印错误信息。 第 9 行中的“MAGIC_MIME”是什么?它看起来像一个 const 或 #define。也许你检查一下这个 magic_open() 函数需要什么。 【参考方案1】:libmagic 的手册页有这个。
magic_load(magic_t cookie, const char *filename);
您正在为filename
参数传递NULL
,因此它将尝试加载默认数据库文件。这似乎失败了。或许将其更改为 actual_file
,然后重试。
【讨论】:
手册中还说文件名可以是NULL
来加载默认数据库。
默认数据库文件名是/usr/share/misc/magic,不存在【参考方案2】:
可能是默认的魔法数据库(将NULL
作为第二个参数传递给magic_load()
时得到的结果未安装,或者在Windows 下找不到。尝试明确,即给它实际的绝对文件名。
文档说:
magic_load() 函数必须用于加载以冒号分隔的数据库文件列表作为文件名传入,或者在执行任何魔术查询之前,默认数据库文件为 NULL。
【讨论】:
我发现了问题。你说的对。我没有找到程序搜索默认魔法数据库的位置,所以我插入了另一个我找到的数据库。 对不起,你是怎么写的?我试过 magic_load(mhandle_magic,"C:\\magic.mgc");和 magic_load(mhandle_magic,"C:\\magic"),但它仍然失败(你是从 Linux 机器上用数据库获取文件吗?或者如何?) 哈哈,原来magic.mgc文件有不同的版本,每个版本的libmagic都不一样,所以首先需要检查magic.mgc文件的版本是否正确使用过,所以要小心!这是我一直坚持的问题。也许,它可以帮助某人。【参考方案3】:您的代码是正确的(除了最后没有检查magic_full
和NULL
。它实际上在我的机器上工作。
您的魔术库有问题 - 可能您没有正确的魔术签名文件,或者您无权访问它,甚至文件已损坏!请检查您是否设置了 MAGIC
env var 是否指向正确的文件!
还尝试像这样确定 magic_load 的默认文件:
$ strace ./magic 2>&1 | grep open
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/usr/lib64/libmagic.so.1", O_RDONLY) = 3
open("/lib64/libc.so.6", O_RDONLY) = 3
open("/lib64/libz.so.1", O_RDONLY) = 3
open("/usr/share/file/magic.mime.mgc", O_RDONLY) = 3
$
这个:"/usr/share/file/magic.mime.mgc"
就是您要查找的内容。
然后,再次使用 strace 在同一 file.yay
上执行 file
(这将确认 *mgc
文件是否良好):
$ strace file --mime `/path/to/file.yay` 2>&1 | grep open
...
open("/usr/share/file/magic.mime.mgc", O_RDONLY) = 3
...
$
祝你好运!
【讨论】:
以上是关于尝试使用第三部分库 libmagic的主要内容,如果未能解决你的问题,请参考以下文章
Pyinstaller - 编译应用程序后找不到 libmagic
库魔法。 text/plain 而不是 text/javascript text/css
python 部分第三方库使用整理(PyInstallerjiebawordcloud自动化安装脚本)