Определить, содержит ли файл текст

Возможный дубликат:
Как определить, является ли файл двоичным или текстовым в C #?
C # - Проверить, является ли файл текстовым

Чтобы лучше понять многопоточность и асинхронные задачи, я написал простое приложение на C # для подсчета общего количества строк кода в проекте (каталоге).

Сейчас я открываю файл и подсчитываю количество строк в каждом файле. Однако сюда входят все файлы (jpg, png, exe и т. Д.). Есть ли способ определить, является ли файл текстовым? Возможно, обнаружив кодировку ASCII или что-то подобное.


person xbonez    schedule 30.11.2011    source источник
comment
Вопрос действительно дублирован, но я думаю, что стоит оставить его открытым, потому что два других упомянутых вопроса не имеют отличных ответов ИМХО.   -  person Serge Wautier    schedule 30.11.2011


Ответы (3)


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

При этом вы могли бы использовать эвристику для наилучшего результата (включая, но, конечно, не ограничиваясь расширениями файлов; исключая хорошо известные нефайловые типы, такие как EXE, DLL, ZIP, файлы изображений, с помощью распознавание их подписи; возможно, в сочетании с подходом, используемым браузеры или Блокнот).

В зависимости от вашего приложения, я думаю, было бы вполне реально просто позволить пользователю выбирать файлы для сканирования (возможно, имея список расширений по умолчанию для включения, например * .cs, * .txt, * .resx, *. xml, ...). Если файл (тип) / расширение отсутствует в списке по умолчанию и не был добавлен пользователем, он не учитывается. Если пользователь добавляет в список тип файла / расширение, не являющийся «текстовым файлом», результаты бесполезны.

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

person Christian.K    schedule 30.11.2011
comment
Обратите внимание, что вторая ссылка не работает. Вот ссылка на заархивированную страницу: http://web.archive.org/web/20131025185229/http://blogs.msdn.com/b/michkap/archive/2007/04/22/2239345.aspx - person Kevin Vuilleumier; 16.09.2014
comment
@kevinvuilleumier, спасибо. Я обновил ссылку на новый блог Майкла Каплана. К счастью, в archive.org нет необходимости. - person Christian.K; 16.09.2014

Тестирование на JPG, PNG, EXE будет дорогостоящим, если вы действительно хотите понять, является ли он двоичным или текстовым. Для JPG вам нужно запустить некоторый алгоритм JPEG, и это касается PNG. А для EXE было бы иначе.

Один из способов проверить нулевой байт в двоичном файле, и люди часто рассматривают процент дросселирования для количества нулевого байта для файла.

Я предлагаю полагаться исключительно на расширение. Был бы очень незначительный случай, когда текстовый файл будет иметь расширение .JPG / .PNG / .EXE.

Просмотрите это расширение списка файлов и укажите расширения текстовых файлов, такие как .txt, .log, .html. , .php, .asp и т. д.

person Abdul Munim    schedule 30.11.2011

FWIW, в Internet Explorer (iow в Windows) есть библиотека под названием MLang, функции обнаружения кодировки. Вероятно, вы можете использовать его, чтобы просто определить, является ли файл текстовым или двоичным.

Вот отличная оболочка C #:

http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

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

person Serge Wautier    schedule 30.11.2011