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おそらくデフォルトのマジック データベース ( 2 番目の引数として渡したときに得られるものmagic_load()はインストールされていないか、Windows では見つかりません。明示的に指定してみてください。つまり、実際の絶対ファイル名を指定してください。

ドキュメントは言う:

マジック クエリを実行する前に、magic_load() 関数を使用して、ファイル名として渡されたデータベース ファイルのコロンで区切られたリストをロードするか、デフォルト データベース ファイルの NULL をロードする必要があります。

于 2013-02-07T13:53:59.117 に答える
1

magic_fullあなたのコードは正しいです(最後にチェックしないことを除いてNULL。それは実際に私のマシンで動作します。

マジックライブラリに問題があります。適切なマジック署名ファイルがないか、アクセスできないか、ファイルが破損している可能性があります。MAGICenv 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);

パラメータを渡しNULLているfilenameので、デフォルトのデータベース ファイルをロードしようとします。これは失敗しているようです。それをおそらくに変更してactual_file、もう一度やり直してください。

于 2013-02-07T13:50:33.593 に答える