如何在 C++ 中找到底层文件类型?

dgu*_*uan 5 c++ linux windows

在 *nix 系统中,有一个名为“file”的命令,它可以告诉您文件的底层类型。比如说,如果您将二进制可执行文件的名称重命名为 foo.txt,或者将 mp3 文件重命名为 .txt,系统将始终告诉您文件的真实类型。但在Windows中,似乎没有这样的功能,如果将可执行文件重命名为.txt,则无法执行它。谁能向我解释一下这是如何在 *nix 系统中完成的,以及如何使用 C++ 找到文件的真实类型,特别是在 Windows 中,我不能使用 std::system("file blah") ?

Teb*_*ebe 3

文件实用程序使用 libmagic 库。它识别文件类型解析文件中的“特殊”字段。
当然,您可以自己编程识别某些格式,但有时这需要大量的工作。例如,当您尝试区分不同格式的 MP4 时。

该库的开发人员做了相当大量的工作。因此,如果您想获得上帝的结果来说明您处理的类型格式,建议使用他们的结果。(实际上,这是一个很大的领域,如果知道您正在使用什么类型格式,最好依赖它们,然后依赖您的代码)

文件实用程序 - http://www.darwinsys.com/file/
您可以下载源代码并查看它们使用了多少种不同的识别类型。下载存档文件-4.26 -> magic -> Magdir

就我个人而言,我很幸运在 Windows ftp://ftp.astron.com/pub/file/上编译了文件 4.26

警告
这只是一种约定,某些格式的文件应该具有预定义的签名,这几乎总是正确的,并且有助于正确识别文件的格式。如果这不是问题,您当然可以信任签名。但请记住,任何拥有足够知识和愿望的人都可以在十六进制编辑器中打开文件并使用位来创建另一种文件格式。