为什么 Windows 中的文本文件和二进制文件有区别?

Naf*_*Kay 5 windows

在许多不同的编程语言中,有一些结构可以专门解决 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
Run Code Online (Sandbox Code Playgroud)

在 Python 中:

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

在其他操作系统上,文本文件和二进制文件与文件系统似乎没有区别。

实际上,我认为实际上文本和二进制文件之间实际上没有区别,因为两者都只是字节的集合。根据编码,文本文件可能很容易在编辑器中表示,而二进制文件通常不会,但底层表示是相同的:按给定顺序的字节序列。

为什么 Windows 做出这种看似不必要的区分?

Syn*_*ech 13

Why is there a difference between text and binary files in Windows?

简答

没有。

长答案

实际上,我认为实际上文本和二进制文件之间实际上没有区别,因为两者都只是字节的集合。根据编码,文本文件可能很容易在编辑器中表示 [原文如此],而二进制文件通常不会,但底层表示是相同的:按给定顺序的字节序列。

正如您所说,文件只是一堆字节。就是这样。它的内容只有在被程序解释时才有意义。一个程序完全有可能以一种方式解释文件中的字节,而另一个程序以另一种方式解释它们。当您在文本编辑器中打开“二进制”文件时,它会将字节解释为文本并显示它们。如果文件不是“纯文本”,那么结果可能是乱码,但程序仍在执行解释和输出它们的工作。

在许多不同的编程语言中,有一些结构可以专门解决 Windows 区分文本文件和二进制文件这一事实。

Windows 没有。正在发生的事情是,大多数此类编程语言是在 Unix、Linux 等其他操作系统上发展而来的,因此对原生纯文本文件使用不同的行尾。它们也可能使用不同的编码,但通常行尾会因平台而异。

以下是常见平台和行尾的列表:

  • Unix, Linux - 换行
  • Windows - 回车、换行
  • 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.binWhy?因为 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 中,当您键入或通过管道传输文件时,shell 会传递所有原始字节,而不是像 Windows 命令提示符那样将其作为文本进行预处理。

也就是说,根据程序和输入文件的传递方式,它可以轻松地完全避免预处理。例如,C:\>pyhton foobar.py baz.bin将输入文件的名称传递给脚本,然后脚本会根据需要打开它,而C:\>type baz.bin | python foobar.py会导致命令提示符读取文件,然后将每一行传递给脚本,这对于二进制文件来说是不好的。

不同的模式只是提供了灵活性,并允许您安全地播放并按照您期望的方式处理文件。


MaQ*_*eod -1

您确实意识到 python 也可以在 *nix 和 mac 上运行,对吧?该功能在那些操作系统上是相同的吗?这不仅仅是 Windows 的事情。查看二进制文件的维基百科文章 - 第一行总结得很好:

二进制文件是一种计算机文件,不是文本文件;它可以包含任何类型的数据,以二进制形式编码以供计算机存储和处理之用。

它接着指出:

二进制文件通常被认为是字节序列,这意味着二进制数字(位)分为八组。二进制文件通常包含旨在解释为文本字符以外的其他内容的字节。

而文本文件要简单得多:

文本文件...是一种计算机文件,其结构为一系列电子文本行。文本文件存在于计算机文件系统中。文本文件的结尾通常通过在文本文件的最后一行之后放置一个或多个特殊字符(称为文件结束标记)来表示

所以是的,答案是它们都是字节序列,但是它们编码数据的方法非常不同。文本编辑器被编程为读取文本文件的编码,而二进制读取器被编程为读取二进制文件的编码。当您在 python 或 ruby​​ 中调用这些函数时,您是在告诉它文件需要什么编码,以便它正确解码。无论您使用什么操作系统,这都是相同的。