我如何在C ++中find底层的文件types?

在* nix系统中有一个名为'file'的命令,它可以告诉你文件的基本types。 比方说,如果你把一个二进制可执行文件的名字改成foo.txt,或者把一个mp3文件改名为.txt,系统会一直告诉你文件的真实types。 但在Windows中,似乎没有这样的function,如果将可执行文件重命名为.txt,则无法执行。 任何人都可以向我解释这是如何在* nix系统中完成的,我怎样才能find使用C ++的文件的真实types,特别是在Windows中,我不能使用std :: system(“file blah”)?

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

那个图书馆的开发人员做了相当多的工作。 所以如果你想让上帝的结果说明你处理的格式是什么(这是一个很大的领域,而且如果知道你正在使用什么类型的格式,那么最好使用它们,然后在你的码)

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

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

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

即使在Unix / Linux下,系统也不能确切地知道文件的类型。 “文件”程序通过将文件的内容与表征各种常见文件类型的模式数据库进行比较来进行有意义的猜测,但这只不过是猜测 – 它不知道所有可能的文件格式,它可以对于那些知道的人来说是错误的。

完全可以为Windows编写一个类似“文件”的程序; 它不依赖于操作系统中的任何特殊功能。 例如,Cygwin提供了“文件”程序的Windows端口。

将程序重命名为具有.txt扩展名的问题与“文件”程序无关。 这是由于Windows决定一个文件是否基于其名称(特别是其扩展名)是否可执行,而Unix / Linux根据其权限决定文件是否可执行,而不是其内容。 如果您在Linux系统上chmod ax程序,系统会认为它是不可执行的,就像从Windows上的程序中删除.exe扩展名一样。

命令参考建议将类型信息保存到外部以供进一步使用。 这也是提到魔术数字,这是指文件签名 。

100%确定文件类型在理论上是不可能的,因为对于某种类型应该包含什么没有精确的规则。 即使他们是这样的规则,也可以改变文件,使其看起来像另一个。 虽然签名和扩展可以给你一个很好的想法是什么类型,你仍然需要面对处理错误类型的可能性。

UNIX 文件命令使用启发式。 有一个神奇数字的数据库,通常在/ usr / share / file / magic/ etc / magic /中 ,允许你添加新的文件“types”以被file命令识别。 它只是简单地探索文件,在其内容中查找幻数(签名)。

UNIX传统上没有Windows所具有的相同类型的文件扩展名和类型关联,尽管Linux在近期积累了这种类型。

我想在Windows上,你至少要检查文件扩展名关联,是正确的。 但即使在给定的扩展名(如.txt)中,个别程序也可以执行自己的启发式。 例如,记事本打开文件时,必须对字符编码进行有根据的猜测。 Raymond Chen在他的博客里写了一篇很好的文章,内容是旧的新事物 – 记事本文件的编码问题,redux