Как проверить, является ли файл текстовым? - PullRequest
1 голос
/ 17 сентября 2010

Я работаю над небольшим приложением для замены текста, которое в основном позволяет пользователю выбрать файл и заменить текст в нем, даже не открывая сам файл.Однако я хочу убедиться, что эта функция работает только для текстовых файлов.Я думал, что смогу сделать это, проверив кодировку файла, но я обнаружил, что файлы .txt в Notepad используют кодировку Unicode UTF-8, как и файлы MS Paint .bmp.Есть ли простой способ проверить это, не накладывая ограничений на сами расширения файлов?

Ответы [ 6 ]

2 голосов
/ 18 сентября 2010

Пока вы не получите огромный намек откуда-то, вы застряли. Чисто, изучая байты, вы получаете ненулевую вероятность, которую вы догадаетесь неправильно, учитывая множество кодировок («ASCII», Unicode, UTF-8, DBCS, MBCS и т. Д.). Да, и что, если первая страница выглядит как ASCII, но следующая страница - это узел btree, который указывает на первую страницу ...

Подсказки могут быть:

  • расширение (маловероятно, что foo.exe доступен для редактирования)
  • что-то в самом потоке (например, BOM [byte-order-marker])
  • руководство пользователя (просто отредактируйте файл, гошдарните)

Windows использовала API-интерфейс IsTextUnicode, который выполнял бы вероятностный анализ, но были хорошо известные ложные срабатывания.

Я считаю, что при попытке быть умнее пользователя возникают некоторые проблемы ...

1 голос
/ 18 сентября 2010

Честно говоря, учитывая среду Windows, с которой вы работаете, я бы рассмотрел белый список известных текстовых форматов. Пользователи Windows обычно обучаются придерживаться расширений. Тем не менее, я бы лично ослабил требование, чтобы оно не работало с нетекстовыми файлами, а вместо этого проверил у пользователя goahead, не соответствует ли файл внутреннему белому списку. Риск изменения двоичного файла будет уменьшен, если строка поиска будет длинной - то есть предполагается, что вы не выполняете преобразование Y2K (а-ля sed 's/y/k/g').

1 голос
/ 18 сентября 2010

Другие сказали посмотреть все байты в файле и посмотреть, являются ли они буквенно-цифровыми.Некоторые утилиты UNIX / Linux делают это, но просто проверяют первые 1K или 2K файла как «оптимистическую оптимизацию».

1 голос
/ 17 сентября 2010

Довольно дорого определить, является ли файл текстовым или нет (т.е. двоичный файл). Вам нужно будет проверить каждый байт в файле, чтобы определить, является ли он допустимым символом, независимо от кодировки файла.

0 голосов
/ 17 сентября 2010

Вы можете написать функцию, которая попытается определить, является ли файл текстовым. Хотя это не будет на 100% точным, этого может быть достаточно для вас. Такая функция не должна проходить через весь файл, около килобайта должно быть достаточно (или даже меньше). Единственное, что нужно сделать, это подсчитать, сколько пробелов и новых строк есть. Другая вещь должна была бы рассмотреть отдельные байты и проверить, являются ли они буквенно-цифровыми или нет. С некоторыми экспериментами вы сможете придумать достойную функцию. Обратите внимание, что это всего лишь базовый подход, и кодирование текста может усложнить ситуацию.

0 голосов
/ 17 сентября 2010

ну, текстовый файл содержит текст, верно? так что действительно простой способ проверить файл, если он содержит только текст, это прочитать его и проверить, содержит ли он буквенно-цифровые символы.

Таким образом, в первую очередь вам нужно проверить кодировку файла, если у вас чисто ASCII, у вас есть простая задача - просто прочитать весь файл в массив char (я предполагаю, что вы делаете это на C / C ++ или аналогичный) и проверьте каждый символ в этом массиве с помощью функций isalpha и isdigit ... конечно, вы должны позаботиться о специальных исключениях, таких как табуляторы '\ t' space '' или символ новой строки ('\ n' в Linux, '\ r' \ 'n' в Windows)

В случае другой кодировки процесс такой же, за исключением того факта, что вам нужно использовать разные функции для проверки, является ли текущий символ буквенно-цифровым символом ... также обратите внимание, что в случае UTF-16 или выше простой массив char просто маленький ... но если вы делаете это, например, в C #, вам не нужно беспокоиться о размере :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...