2

我尝试使用此代码:

#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,没有任何构建错误。

4

3 回答 3

2

可能是默认的魔法数据库(NULL作为第二个参数传递时得到magic_load()的没有安装,或者在 Windows 下找不到。尝试明确,即给它实际的绝对文件名。

文档说:

在执行任何魔术查询之前,必须使用 magic_load() 函数来加载作为文件名传入的数据库文件的冒号分隔列表,或者默认数据库文件为 NULL。

于 2013-02-07T13:53:59.117 回答
1

您的代码是正确的(除了最后没有检查magic_fullNULL它实际上可以在我的机器上运行。

您的魔术库有问题 - 也许您没有正确的魔术签名文件,或者您无权访问它,甚至文件已损坏!请检查您是否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相同操作file.yay(这将确认*mgc文件是否良好):

$ strace file --mime `/path/to/file.yay` 2>&1 | grep open
...
open("/usr/share/file/magic.mime.mgc", O_RDONLY) = 3
...
$

祝你好运!

于 2013-02-07T14:26:56.270 回答
1

libmagic 的手册页有这个。

magic_load(magic_t cookie, const char *filename);

您正在传递参数NULLfilename因此它将尝试加载默认数据库文件。这似乎失败了。将其更改为actual_file也许,然后重试。

于 2013-02-07T13:50:33.593 回答