哪个在搜索某种类型的文件时效率更高?

which one will be more efficient in searching of a certain type of file?

假设我正在设计一个文件管理器,并想通过假设的类型实现文件搜索,那么这些方法中的哪一种会更有效 -

  1. 使用文件名和trim每个文件的扩展名。

  2. 我们正在搜索的文件类型使用特定字节,例如在 jpeg 图像的情况下。

bytes 0xFF, 0xD8 indicate start of image

bytes 0xFF, 0xD9 indicate end of image

因为您必须在打开它之前知道它的文件名,所以名称 trim 选项可能会更快。但是,如果扩展名与实际文件类型不匹配,则使用该方法可能会得到错误的结果。

这样做会节省一些系统调用(打开、读取,也许是 fseek、关闭)。

假设您的目标是:"search a file by its type"在没有进一步限制的情况下,您必须通过检查实际数据来实现。

但是您可能会接受一些误报和漏报。如果您仅通过查找扩展名来搜索图像文件,则对于图像文件,您可以获得 "image.jpg?width=1024&height=800" 而不是 "image.jpg",假阴性,或者 "image.jpg" 而不是 "image.exe" , 误报。

另一方面,您可以检查文件中的前几个字节——大多数图像数据方案都有一个单独的 header。这种方法的失败点要少得多。如果你得到一大块随机数据,其第一个字节类似于图像文件的 header,你可能会得到误报。可能,但极不可能。如果 header 被剥离(例如:在传输中,以某种方式,或者生成文件的错误脚本),您可能会得到假阴性。也有可能,也不太可能,甚至更多,if not much more.

小型 Unix 工具 file 可以做到这一点,并且曾经有一个易于解析的工具 text-file 您可以将其用于自己的项目。现在它是一个包含几个单个文件的大文件夹,甚至没有安装,只是以预编译的形式。您可以在线找到带有 text-file 的文件夹,例如:http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/saucy/file/saucy/files/head:/magic/Magdir/ The format is described in the manpage magic(5) which is also online at e.g.: https://linux.die.net/man/5/magic