Why is there a difference between text and binary files in Windows?
Resposta curta
Não há.
Resposta longa
In reality, I'd assume that there's literally no difference between a text and a binary file in reality, as both are simply a collection of bytes. A text file may be easily representable [sic] in an editor depending on the encoding whereas a binary file generally won't be, but the underlying representation is the same: a sequence of bytes in a given order.
Como você disse, um arquivo é apenas um monte de bytes. É isso aí. Seu conteúdo só assume significado quando interpretado por um programa . É inteiramente possível para um programa interpretar os bytes em um arquivo de uma maneira e outro programa para interpretá-los em outro. Quando você abre um arquivo “binário” em um editor de texto, ele interpreta os bytes como texto e os exibe. Se o arquivo não for “texto sem formatação”, os resultados provavelmente serão ininteligíveis, mas o programa ainda está fazendo seu trabalho de interpretá-los e gerá-los.
In many different programming languages, there are constructs in place to specifically work around the fact that Windows differentiates between text and binary files.
O Windows não. O que está acontecendo é que a maioria dessas linguagens de programação evoluiu em outros sistemas operacionais como Unix, Linux, etc. e, portanto, usam diferentes terminações de linha para arquivos de texto simples nativos. É possível que eles também usem uma codificação diferente, mas geralmente são os fins de linha que variam de plataforma para plataforma.
Aqui está uma lista de plataformas comuns e finais de linha:
- Unix, Linux - line-feed
- Windows - retorno de carro, avanço de linha
- Mac (historicamente) - retorno de carro
- (alguns sistemas operacionais antigos (por exemplo, Acorn BBC) - linha de alimentação, retorno de carro)
Why does Windows make this distinction which is seemingly unnecessary?
O Windows é um sistema operacional, ele não distingue nada em si. A pergunta que você deve fazer é quais partes do Windows estão se distinguindo. Nesse caso, é o prompt de comando que trata os arquivos de texto e binários de maneira diferente e, mesmo assim, depende do comando que está sendo usado. Por exemplo, o comando del foobar.txt
não é diferente de del foobar.bin
, mas copy a.txt + b.txt c.txt
é diferente de copy /b a.bin + b.bin c.bin
Por quê? Porque o prompt de comando do Windows quer ser útil e interpreta arquivos de texto como tal e copia as linhas para a saída (adicionando uma nova linha entre os arquivos), mas copia arquivos binários como é sem interferência.
For example, in 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
In Python:f = open("filename.bin", "rb") # read a file in binary mode
f = open("filename.txt", "r") # read a file in text mode
On other operating systems, it seems that there's no difference between a text file and a binary file with the filesystem.
Essas são todas linguagens de script e, portanto, são executadas a partir da linha de comando. Ao trabalhar com arquivos de entrada de texto, geralmente não há muito problema, mas com arquivos binários, você usa o modo binário para evitar que o prompt de comando pré-processe o arquivo e o transmita como bytes brutos.
No Linux, quando você digita ou envia um arquivo, o shell passa todos os bytes brutos em vez de pré-processá-lo como texto, como o prompt de comando do Windows.
Dito isso, dependendo do programa e de como o arquivo de entrada é passado, ele pode facilmente evitar o pré-processamento. Por exemplo, C:\>pyhton foobar.py baz.bin
passaria o nome do arquivo de entrada para o script que então o abriria da forma que preferir, enquanto C:\>type baz.bin | python foobar.py
faria com que o prompt de comando lesse o arquivo e passasse cada linha para o script, que para um arquivo binário não é bom.
Os modos diferentes permitem flexibilidade e permitem que você jogue com segurança e trate os arquivos como você espera.