Это в основном сводится к эвристике для определения содержимого файлов. Например, для текстовых файлов (ASCII) должна быть возможность сделать довольно правильное предположение, проверив диапазон значений байтов, используемых в файле - хотя это никогда не будет полностью надежным.
Вы должны попытаться ограничить классы типов файлов, которые вы хотите идентифицировать, например, достаточно ли различать «текстовые данные» и «двоичные данные»? Если это так, вы сможете получить довольно высокий показатель успешности обнаружения.
Для систем UNIX всегда есть file file , которая пытается определить типы файлов на основе (в основном) содержимого.