Windows не понимает разницы между бинарными и текстовыми файлами, воспринимая поток данных просто как набор байт. Поэтому за управление режимами обработки отвечает сам разработчик: либо вручную добавляет управляющие символы, либо поручает это сторонней библиотеке. При работе с высоким уровнем абстракции, например в C runtime, файлы открывают в режиме "w" для текста или "wb" для бинарных данных. Эти библиотеки выполняют необходимые конвертации, например переход от ASCII к Unicode или замену символов возврата каретки на обратные связи перед тем, как передать данные в системный вызов WriteFile. Как только данные достигают этой функции, дополнительные преобразования в самой системе Windows не производятся. Некоторые пользователи ищут аналог старого MS-DOS ioctla AH=4401h, где флаги передавались в регистре DX, но этот механизм работает только для устройств ввода-вывода. Попытка применить его к файлам на диске возвращает ошибку ERROR_INVALID_FUNCTION. Искусственное обращение к этому механизму вызывает проверку прав, где если регистр AL содержит значение больше 2, код переходит на обработку строковых данных, иначе считывает идентификатор устройства из таблицы и проверяет, является ли объект устройством или файлом. Если это не устройство, вызов прерывается с сообщением о невалидной функции. Единственный встроенный способ изменить настройки терминала — это Win32 API SetConsoleMode, который управляет буферизацией строк и сопоставим с Unix утилитой stty. Для обработки содержимого обычных файлов остаётся два пути: выполнить трансформацию самостоятельно или переложить эту задачу на библиотеку.
Windows не различает текстовые и бинарные файлы
05.05.2026 06:14 · hackernews