尝试使用第三部分库 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_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.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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Heroku 上安装 libmagic?

Pyinstaller - 编译应用程序后找不到 libmagic

库魔法。 text/plain 而不是 text/javascript text/css

python 部分第三方库使用整理(PyInstallerjiebawordcloud自动化安装脚本)

pyinstaller打包资源文件及包含eyed3模块时提示找不到libmagic处理

静态编译libmagic(c/c++文件类型检测)