我正在尝试使用 libmagic 和以下代码来确定几种类型的文件的 mime 类型:
auto handle = ::magic_open(MAGIC_MIME_TYPE);
::magic_load(handle, NULL);
// Both of these fail with the same error
// file_path being a const char* with the path to the file.
auto type2 = ::magic_file(handle, file_path);
// svg_content being an std::vector<char> with the contents of the file.
//auto type2 = ::magic_buffer(handle, svg_content.data(), svg_content.size());
if(!type2)
{
std::cout << magic_error(handle) << std::endl;
}
::magic_close(handle);
但是对于我尝试的任何文件或缓冲区,我都会收到正则表达式错误,或者是或类似于:
46: '(dryad-bibo/v)[0-9].[0-9]' 的正则表达式错误 17,(匹配失败)
例如这个 .svg 文件:
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-no" viewBox="0 0 640 480">
<path fill="#ed2939" d="M0 0h640v480H0z"/>
<path fill="#fff" d="M180 0h120v480H180z"/>
<path fill="#fff" d="M0 180h640v120H0z"/>
<path fill="#002664" d="M210 0h60v480h-60z"/>
<path fill="#002664" d="M0 210h640v60H0z"/>
</svg>
到目前为止我已经尝试过:
- libmagic 5.35
- libmagic 5.39
- libmagic 5.40
- 来自 opensource.apple 的 libmagic
- 将 LC_TYPE 和 LANG 设置为“C”
我正在链接本地构建的 libmagic 版本,在构建时我会遗漏什么吗?是否有任何呼叫不正确或有什么我遗漏的?
尝试运行在本地编译的相关文件二进制文件时出现类似错误。而当我使用默认可用的文件命令时,我会得到 image/svg+xml 作为输出。
编辑
为了构建 libmagic(适用于 macOS 和 Ubuntu),我按照以下步骤操作:
- 从Github下载相关版本
- 自动重新配置——安装
- 。/配置
- 制作
- 进行安装
更新
看起来这个文件底部的正则表达式导致了问题(至少对于 svg):
https://github.com/file/file/blob/b56b58d499dbe58f2bed28e6b3c297fe7add992e/magic/Magdir/dataone
更新 2
发生了一些奇怪的事情;在我让它工作的系统上,按预期magic_version()
报告540 。但是在出现此错误而失败的系统上,magic_version()
报告538。
这对我来说毫无意义,因为我在系统本身的任何地方都找不到该版本,当我./file --version
在构建库中运行时,它会报告file-5.40
.