Открываете файл, читаете заголовок, в соответствии с заголовком добавляете расширение. Только заголовок у doc/xls/ppt/msi и кучи других типов одинаковый, соответственно для точного понимания типа нужно больше копаться в файле и смотреть имена потоков. Как вы уже верно заметили, docx/xlsx являются ZIP-архивами, и чтобы отличить тупо архив от DOCX тоже придется ковыряться.
Второй вариант - ищете тулзу типа unix file, натравливаете ее на каждый файл, смотрите тип, который она вернула, переименовываете.