пытаюсь использовать библиотеку третьей части, libmagic

я пытаюсь использовать этот код:

#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, ошибок сборки нет.


person user2050969    schedule 07.02.2013    source источник
comment
Ничто в вашем коде не C++, это все C.   -  person Some programmer dude    schedule 07.02.2013
comment
Что касается ошибки, дайте полное сообщение об ошибке, код печатает сообщение об ошибке из библиотеки.   -  person Some programmer dude    schedule 07.02.2013
comment
Что такое MAGIC_MIME в строке 9? Это похоже на константу или #define. Может быть, вы проверите, что нужно этой функции magic_open().   -  person marscode    schedule 07.02.2013


Ответы (3)


Вероятно, волшебная база данных по умолчанию (то, что вы получаете при передаче NULL в качестве второго аргумента для magic_load(), не установлено или не найдено в Windows. Попробуйте быть явным, т. Е. Дайте ей фактическое абсолютное имя файла.

Документы говорят:

Функция magic_load() должна использоваться для загрузки списка файлов базы данных, разделенных двоеточиями, переданных в качестве имени файла, или NULL для файла базы данных по умолчанию, прежде чем можно будет выполнить какие-либо магические запросы.

person unwind    schedule 07.02.2013
comment
Я нахожу проблему. Ты прав. Я не нахожу, где программа ищет магическую базу данных по умолчанию, поэтому вставляю другую базу данных, которую нахожу. - person user2050969; 08.02.2013
comment
простите, а как именно вы это написали? Я пробовал magic_load(mhandle_magic,C:\\magic.mgc); и magic_load(mhandle_magic,C:\\magic), но все равно не получается (Вы взяли файл с базой данных с Linux-машины? или как? ) - person Tebe; 09.02.2013
comment
ха, оказалось, что существуют разные версии файла magic.mgc, он не одинаков для каждой версии libmagic, поэтому нужно сначала проверить, используется ли правильная версия файла magic.mgc, так что будьте осторожны! Это была моя проблема, с которой я застрял. Возможно, кому-то поможет. - person Tebe; 11.02.2013

На справочной странице libmagic есть это.

magic_load(magic_t cookie, const char *filename);

Вы передаете NULLдля параметра filename, поэтому он попытается загрузить файл базы данных по умолчанию. Который, кажется, терпит неудачу. Возможно, измените это на actual_file и повторите попытку.

person jcopenha    schedule 07.02.2013
comment
В руководстве также указано, что имя файла может быть NULL для загрузки базы данных по умолчанию. - person Some programmer dude; 07.02.2013
comment
имя файла базы данных по умолчанию — /usr/share/misc/magic, которого не существует - person ; 07.02.2013

Ваш код правильный (за исключением того, что в конце не проверяется magic_full на NULL. Он действительно работает на моей машине.

У вас проблема с магической библиотекой - возможно, у вас нет нужного файла магических подписей, или у вас нет к нему доступа, или даже файл поврежден! Убедитесь, что если у вас установлена ​​переменная окружения MAGIC, она указывает на правильный файл!

Также попробуйте определить файл по умолчанию для 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" это то, что вы ищете. Затем снова выполните file на том же file.yay с помощью strace (это подтвердит, что файл *mgc в порядке):

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

Удачи!

person RumburaK    schedule 07.02.2013