如何确定文件是二进制还是文本?

时间:2012-08-07 08:07:07

标签: objective-c xcode macos encoding mime-types

我正在编写一个应用程序,我需要确定用户提供的文件是否为文本,因为我正在其中执行搜索。

我不是基于扩展程序,因为我想在源代码文件中搜索,例如,或者任何其他具有文本内容的文件(即使是不熟知的扩展名)。

有没有办法确定文件是否是文本?

4 个答案:

答案 0 :(得分:1)

感谢大家提供的解决方案! 我刚刚发现了一个似乎很好地完成工作的框架!

我在这里留下一个参考链接:https://github.com/aidansteele/MagicKit

答案 1 :(得分:0)

  

无法确定。但请注意大多数控制字符   不会出现在ASCII文件中。   您可以通过制作大部分ASCII的子集来做出相当不错的猜测   控制字符。然后计算文件中的字符数   在子集中,ASCII文件的计数应为零。   但归根结底,你必须证明是消极的,这是一个麻烦   要做的事。

答案 2 :(得分:0)

您需要打开并阅读数据。

对于ASCII文本文件,这意味着检查字符是否在可打印范围内。

对于UTF文本文件,您可能需要首先阅读BOM(字节顺序标记),以便在读取文件的其余部分之前确定编码。

在此处阅读更多内容:http://en.wikipedia.org/wiki/Text_file

答案 3 :(得分:-1)

试试以下方法:

func isBinary(_ path: String) -> Bool? {
    if FileManager.default.fileExists(atPath: path) == false {
        return nil
    }

    return ( try? String(contentsOfFile: path) ) == nil
}
  1. 如果文件不存在,则返回 nil
  2. 如果文件存在则返回它是二进制或文本

这段代码的问题是它不适用于大文件(检查时间会很长)