1

我想验证路径中的给定文件是文本文件类型,即不是二进制文件,即人类可读。我想阅读第一个字符并检查每个字符:

  • 是字母数字
  • 是特别的
  • 是分隔符
  • isOctetCharacter ???

但是将所有这些测试方法与 and: [ ... and: [ ... and: [ ] ] ] 结合起来似乎不是很啰嗦。对更优雅的方式有什么建议吗?

(这里有一个 Python 版本How to identify binary and text files using Python?这可能很有用,但语法和实现看起来像 C。)

4

2 回答 2

1

只有启发式;你永远无法确定...

对于 ascii,可以执行以下操作:

|isPlausibleAscii numChecked|

isPlausibleAscii := 
    [:char |
        ((char codePoint between:32 and:127)
        or:[ char isSeparator ])
    ].

numChecked := text size min: 1024.
isPossiblyText := text from:1 to:numChecked conform: isPlausibleAscii.

对于 unicode(UTF8 ?),事情变得更加困难;然后你可以尝试转换。如果存在转换错误,则假定为二进制。

PS:如果您没有 from:to:conform:,请替换为 (copyFrom:to:) 符合:

PPS:如果您没有 conform: ,请尝试 allSatisfy:

于 2012-06-04T21:44:35.037 回答
0

所有文本都包含比您期望在二进制文件中看到的更多空间,并且某些编码 (UTF16/32) 将包含许多通用语言的 0。一个 smalltalky 的解决方案是在 Standard/MultiByte-FileStream 的方法中隐藏血淋淋的细节,#isProbablyText 可能是一个不错的选择。

它本质上会执行以下操作: - 如果您打算稍后使用它,则存储当前状态,重置以启动(如果您使用 MultiByteStream,则设置 Latin1 转换器)

  • 迭代 N 个下一个字符(其中 N 是一个适当的数字)

  • 遇到不可打印的 ascii 字符?它可能是二进制的,所以返回 false。(不是特殊的选择器,使用地图,在 Character 上实现一个新方法什么的)

  • 如果合适,增加 2 个计数器,一个用于空格字符,另一个用于零字符。

  • 如果循环完成,则返回是否已读取任一计数器的统计显着量

TLDR;用一种方法来隐藏血淋淋的细节,否则几乎是一样的。

于 2011-08-12T07:57:45.743 回答