我尝试使用此代码:
#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,没有任何构建错误。
答案 0 :(得分:2)
可能是默认魔术数据库(将NULL
作为第二个论证者传递给magic_load()
时获得的内容未安装,或者在Windows下找不到。请尝试显式,即给它实际的绝对值文件名。
文档说:
必须使用magic_load()函数加载以文件名形式传入的冒号分隔的数据库文件列表,或者在执行任何魔术查询之前加载默认数据库文件的NULL。
答案 1 :(得分:1)
libmagic的手册页有这个。
magic_load(magic_t cookie, const char *filename);
您正在为NULL
参数传递filename
,因此它将尝试加载默认数据库文件。这似乎是失败的。将其更改为actual_file
,然后重试。
答案 2 :(得分:1)
您的代码是正确的(除了最后没有检查magic_full
NULL
。它实际上可以在我的机器上运行。
你有魔术库的问题 - 也许你没有合适的魔术签名文件,或者你没有访问它,甚至文件已损坏!如果你有MAGIC
env var set,请检查它是否指向正确的文件!
还尝试确定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
上file.yay
(这将确认*mgc
文件是否良好):
$ strace file --mime `/path/to/file.yay` 2>&1 | grep open
...
open("/usr/share/file/magic.mime.mgc", O_RDONLY) = 3
...
$
祝你好运!