Не слишком красивый код, но работает чётко. И подпапки смотрит, и в них подпапки (и сколько хотите) и пустые папки, и в файлы отличает, которые меньше 50 байт. Но валидатор не пропускает. В чём дело?