假设我正在设计一个文件管理器,并希望假设按文件类型实现文件搜索,那么这些方法中的哪一种会更有效 -
-
使用文件的名称并修剪每个文件的扩展名。
为 我们正在搜索的文件类型使用特定字节,例如在 JPEG 图像的情况下。
bytes 0xFF, 0xD8 indicate start of image bytes 0xFF, 0xD9 indicate end of image
由于您必须在打开它之前知道它的文件名,因此名称修剪选项可能会更快。但是,如果扩展名与实际文件类型不匹配,则使用该方法可能会产生错误结果。
这样做可以节省一些系统调用(打开,读取,也许是fseek,关闭)。
假设您的目标是:"按文件类型搜索文件"而没有进一步的限制,您必须通过检查实际数据来做到这一点。
但您可能可以接受一些误报和漏报。如果您仅通过查找扩展名来搜索图像文件,则可以获得"image.jpg?width=1024&height=800"而不是"image.jpg",用于图像文件,漏报,或"image.jpg"而不是"image.exe",误报。
另一方面,您可以检查文件中的前几个字节 - 大多数图像数据方案都有一个单独的标头。这种方法的故障点要少得多。如果您获得了一大块随机数据,其中第一个字节类似于图像文件的标头,则可能会获得误报。有可能,但极不可能。如果标头被剥离,您可能会得到漏报(例如:在传输中,以某种方式,或生成文件的错误脚本)。也有可能,也不太可能,甚至更多,如果不是更多的话。
小型Unix工具file
做到这一点,并且曾经有一个易于解析的文本文件,您可以将其用于自己的项目。如今,它是一个包含多个单个文件的大文件夹,甚至没有安装,只能以预编译的形式安装。您可以在线找到包含文本文件的文件夹,例如: http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/saucy/file/saucy/files/head:/magic/Magdir/该格式在手册页magic(5)
中描述,该手册页也在线,例如:https://linux.die.net/man/5/magic