Why is there a difference between text and binary files in Windows?
Короткий ответ
Нет
Длинный ответ
На самом деле, я бы предположил, что в действительности нет разницы между текстом и двоичным файлом, поскольку оба являются просто набором байтов. Текстовый файл может быть легко представлен в редакторе [sic] в зависимости от кодировки, тогда как двоичный файл обычно не будет, но базовое представление такое же: последовательность байтов в заданном порядке.
Как вы сказали, файл - это просто набор байтов. Вот и все. Его содержание имеет смысл только тогда, когда интерпретируется программой. Одна программа может полностью интерпретировать байты в файле одним способом, а другая - другим. Когда вы открываете «двоичный» файл в текстовом редакторе, он будет интерпретировать байты как текст и отображать их. Если файл не является «простым текстом», то результаты, скорее всего, будут бессмысленными, но программа все еще выполняет свою работу по их интерпретации и выводу.
Во многих различных языках программирования существуют конструкции, специально предназначенные для обхода того факта, что Windows различает текстовые и двоичные файлы.
Windows не имеет. Происходит то, что большинство таких языков программирования развивались в других операционных системах, таких как Unix, Linux и т.д., И поэтому используют разные окончания строк для собственных текстовых файлов. Возможно, что они также используют другую кодировку, но, как правило, конечные строки будут варьироваться от платформы к платформе.
Вот список общих платформ и окончаний строк:
- Unix, Linux - перевод строки
- Окна - возврат каретки, перевод строки
- Mac (исторически) - возврат каретки
- (Несколько старых ОС (например, Acorn BBC) - перевод строки, возврат каретки)
Почему Windows делает это различие, которое кажется ненужным?
Windows - операционная система, она сама по себе ничего не различает. Вопрос, который вы должны задать, состоит в том, какие части Windows отличаются. В этом случае это командная строка, которая обрабатывает текстовые и двоичные файлы по-разному, и даже в этом случае это зависит от используемой команды. Например, команда del foobar.txt
ничем не отличается от del foobar.bin
, однако copy a.txt + b.txt c.txt
отличается от copy /b a.bin + b.bin c.bin
Почему? Поскольку командная строка Windows , хочет быть полезными и интерпретирует текстовые файлы как таковые и копию линий на выход ( при добавлении новой строки между файлами), но копирует бинарные файлы , как это без каких - либо помех.
Например, в Ruby:
f = File.open('filename.bin', 'rb') # read a file in binary mode
f = File.open('filename.txt', 'r') # read a file in text mode
В Python:
f = open("filename.bin", "rb") # read a file in binary mode
f = open("filename.txt", "r") # read a file in text mode
В других операционных системах кажется, что нет разницы между текстовым файлом и двоичным файлом с файловой системой.
Все это языки сценариев, и поэтому запускаются из командной строки. При работе с файлами ввода текста, как правило, проблем не так много, но с двоичными файлами вы используете двоичный режим, чтобы избежать командной строки от предварительной обработки файла и передачи его в виде необработанных байтов.
В Linux, когда вы вводите или передаете файл по каналу, оболочка передает все необработанные байты вместо предварительной обработки его в виде текста, как в командной строке Windows.
Тем не менее, в зависимости от программы и способа передачи входного файла, можно легко избежать предварительной обработки. Например, C:\>pyhton foobar.py baz.bin
передает имя входного файла скрипту, который затем открывает его по своему усмотрению, тогда как C:\>type baz.bin | python foobar.py
заставит командную строку прочитать файл, а затем передать каждую строку скрипту, что для двоичного файла не годится.
Различные режимы просто обеспечивают гибкость и позволяют вам играть безопасно и обрабатывать файлы так, как вы ожидаете.