【发布时间】:2014-07-15 05:23:22
【问题描述】:
在*nix 系统中有一个叫做'file'的命令,它可以告诉你一个文件的底层类型。比如说,如果您将二进制可执行文件的名称重命名为 foo.txt,或者将 mp3 文件重命名为 .txt,系统总是会告诉您文件的真实类型。但在 Windows 中,似乎没有这样的功能,如果将可执行文件重命名为 .txt,则无法执行。谁能向我解释这是如何在 *nix 系统中完成的,以及如何使用 C++ 找到文件的真实类型,尤其是在我无法使用 std::system("file blah") 的 Windows 中?
【问题讨论】:
-
这是一种启发式算法,它检查文件的前几个(或几百个)字节以寻找“魔术字符串”。许多类型的文件在早期就包含固定的字节序列。请参阅维基百科上的List of file signatures。
-
你需要它做什么?
-
实际上,您可以在 Windows 中执行任何兼容的二进制文件,而不管其扩展名如何,只有 Window 的 Shell (explorer) 会阻止它。大多数商业游戏的实际可执行文件根本不是 .exe。
-
我写了一些应用程序来做一些自定义数据库的维护工作,有不同版本的历史数据,不同的格式和不同的扩展名。我实际上已经通过使用扩展名来确定文件的版本来完成应用程序,但这让我对文件命令感到疑惑,所以我想知道如何确定文件的真实类型。