Por que existe uma diferença entre os arquivos de texto e binários no Windows?

4

Em muitas linguagens de programação diferentes, há construções para especificamente trabalhar em torno do fato de que o Windows diferencia entre arquivos de texto e binários.

Por exemplo, em 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

Em Python:

f = open("filename.bin", "rb")  # read a file in binary mode
f = open("filename.txt", "r")   # read a file in text mode

Em outros sistemas operacionais, parece que não há diferença entre um arquivo de texto e um arquivo binário com o sistema de arquivos.

Na realidade, eu suponho que literalmente não há diferença entre um texto e um arquivo binário na realidade, pois ambos são simplesmente uma coleção de bytes. Um arquivo de texto pode ser facilmente representado em um editor, dependendo da codificação, enquanto um arquivo binário geralmente não será, mas a representação subjacente é a mesma: uma seqüência de bytes em uma determinada ordem.

Por que o Windows faz essa distinção que aparentemente é desnecessária?

    
por Naftuli Kay 19.11.2013 / 02:55

3 respostas

9

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.

    
por 19.11.2013 / 03:21
1

O CP / M (Programa de Controle para Microcomputadores) foi criado pela Digital Research na década de 1970. Os tamanhos de arquivo no CP / M foram expressos como uma contagem de setores de disco de 128 bytes - em outras palavras, uma contagem de bytes exata do tamanho do arquivo não estava disponível. Isso não era (muito) um problema para arquivos binários, já que 127 bytes extras de NULLs (ou qualquer outro) normalmente não afetam negativamente o carregamento do programa. No entanto, era problemático para arquivos de texto, que poderiam ter um comprimento arbitrário.

Assim, CP / M distinguiu entre arquivos binários e arquivos de texto. Por convenção, o byte final de um arquivo de texto era um caractere Control-Z dentro da banda - você leu o arquivo até ver ^ Z e depois parou. (Arquivos binários não requerem esse processamento; você acabou de carregar a contagem de setores brutos.)

O CP / M era muito popular e foi invadido por muitas pessoas. Um dos caras que o invadiram foi chamado Tim Paterson, que trabalhava para uma pequena empresa chamada Seattle Computer Products. Ele reuniu um clone CP / M para hardware de classe x86 chamado QDOS (Quick and Dirty Operating System), que imitava uma boa quantidade de design funcional do CP / M. Então, o QDOS foi comprado por um abandono da faculdade chamado Bill Gates, que o aumentou ainda mais, levando adiante todas as falhas e limitações do projeto, e criou o MS-DOS. E o próprio Windows começou a vida como um kluge em cima do MS-DOS.

Embora a Microsoft tenha aprendido - provavelmente por puro acidente - como criar um sistema de arquivos que mantém contagens de bytes exatas para arquivos, a distinção entre arquivos binários e de texto permanece, mesmo que não sirva mais a nenhum propósito útil.

    
por 19.11.2013 / 03:35
-1

Você percebe que o python é executado também no * nix e no mac, certo? e essa função é a mesma nesses sistemas operacionais? Não é apenas uma coisa do Windows. Veja o artigo da Wikipedia sobre arquivos binários - a primeira linha resume bem:

A binary file is a computer file that is not a text file; it may contain any type of data, encoded in binary form for computer storage and processing purposes.

Continua afirmando:

Binary files are usually thought of as being a sequence of bytes, which means the binary digits (bits) are grouped in eights. Binary files typically contain bytes that are intended to be interpreted as something other than text characters.

Considerando que os arquivos de texto são muito mais simples:

A text file...is a kind of computer file that is structured as a sequence of lines of electronic text. A text file exists within a computer file system. The end of a text file is often denoted by placing one or more special characters, known as an end-of-file marker, after the last line in a text file

Então, sim, a resposta é que ambos são uma sequência de bytes, mas o método pelo qual eles codificam os dados é muito diferente. Um editor de texto é programado para ler a codificação de um arquivo de texto e um leitor binário é programado para ler a codificação de um arquivo binário. Quando você chama essas funções em python ou ruby, você está dizendo qual codificação esperar do arquivo para que ele decodifique-o corretamente. Isso seria o mesmo, independentemente do sistema operacional em que você está.

    
por 19.11.2013 / 03:16

Tags