Как определить двоичные и текстовые файлы с помощью Smalltalk - PullRequest
1 голос
/ 12 августа 2011

Я хочу убедиться, что данный файл в пути имеет тип текстового файла, то есть не двоичный, то есть читаемый человеком.Я предполагаю чтение первых символов и проверяю каждый символ с помощью:

  • isAlphaNumeric
  • isSpecial
  • isSeparator
  • isOctetCharacter ???

но объединение всех этих методов тестирования с помощью и: [... и: [... и: []]], похоже, не слишком мелко.Любое предложение для более элегантного способа?

(Здесь есть версия Python Как определить двоичные и текстовые файлы с использованием Python? , которые могут быть полезны, но синтаксис и реализация похожи на C.)

Ответы [ 2 ]

1 голос
/ 05 июня 2012

только эвристика;вы никогда не можете быть по-настоящему уверены ...

Для 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: если у вас нет от: до: соответствия: замените на (copyFrom: до :) соответствия:

PPS: еслиу вас нет соответствия:, попробуйте всеSatisfy:

0 голосов
/ 12 августа 2011

Весь текст содержит больше места, чем вы ожидаете увидеть в двоичном файле, а некоторые кодировки (UTF16 / 32) будут содержать множество нулей для обычных языков. Небольшое решение было бы скрыть кровавые подробности в методе Standard / MultiByte-FileStream, вероятно, #isProbblyText был бы хорошим выбором.

По сути, это будет делать следующее: - сохранить текущее состояние, если вы собираетесь использовать его позже, сбросить на старт (установить конвертер Latin1, если вы используете MultiByteStream)

  • Перебирать N следующих символов (где N - подходящее число)

  • Обнаружили непечатаемый символ ascii? Вероятно, это двоичный файл, поэтому верните false. (не специальный селектор, используйте карту, реализуйте новый метод для персонажа или чего-то еще)

  • При необходимости увеличьте 2 счетчика, один для пробельных символов, а другой для нулевых символов.

  • Если цикл завершается, вернуть, был ли считан какой-либо из счетчиков статистически значимой суммы

TLDR; Используйте метод, чтобы скрыть кровавые подробности, в противном случае это почти то же самое.

...