如何检查文件是图像还是ascii文本文件? 例如,检查" file1"是ascii text或binary image / png文件。
答案 0 :(得分:4)
我不熟悉Elixir,但明显与语言无关的解决方案是使用file
命令行工具(在类Unix系统上是标准的,包括Linux和MacOS,并且可以安装作为Windows上的第三方应用程序)或它所基于的 libmagic 库。这些方法适用于任何可以调用外部程序和/或使用C风格ABI调用动态链接库的语言(可能通过某种类型的包装器模块)。
file
和 libmagic 的工作方式是,针对不同的文件格式读取预编译的list of simple characteristic patterns,并根据文件的内容测试每个文件格式。如果您愿意,您可以自己为模式格式编写解析器,从而生成file
的纯Elixir重新实现。我不是说这会是微不足道的,但是优点(仅仅是硬编码一堆文件格式测试)就是你仍然可以使用相同的模式数据库,它已包含 huge <的模式/ em>格式数量,并且不断更新。
在任何情况下,如果您仅对区分几种不同类型的文件(例如,PNG图像和纯ASCII文本文件)感兴趣,那么自己对相关测试进行硬编码可能是可行的。例如:
PNG图像文件有a fixed 8-byte header,它在文件开头的存在非常好地表明这是一张PNG图像。如果您想要更加确定,可以阅读以下IHDR
块并验证其类型和CRC校验和是否正确。其他图像格式(如JPEG和GIF)也有类似的format signatures。
纯ASCII文本文件应仅包含可打印ASCII范围(32-126)中的字节加上一些控制字符(最常见的是TAB = 9,LF = 10和CR = 13) 。使用其他ASCII兼容字符集(如UTF-8)的文本文件也可能包含128-255范围内的字节;特别是UTF-8很容易识别,因为该范围内的字节总是出现在两个或更多的组中,并且在very specific pattern中。