c#为什么复制文件的最后一个字节不同?

时间:2010-12-30 03:40:53

标签: c# file-io

我正在编写一个程序来读写特定的二进制文件格式。 我相信我有95%的工作。我遇到了一个奇怪的问题。

在屏幕截图中,我展示了我编写的一个程序,它逐字节地比较两个文件。最后一个字节应为0但是为FFFFFFF。

使用二进制查看器我可以看到文件没有区别。它们看起来完全相同。 此外,Windows告诉我文件的大小不同,但磁盘上的大小是相同的。

有人可以帮我理解发生了什么吗? alt text

原件位于左侧,我的副本位于右侧。

2 个答案:

答案 0 :(得分:1)

可能的答案:

  1. 您忘记致电Stream.close()Stream.Dispose()

  2. 您的代码正在弄乱文本和其他类型的数据(例如,将-1方法中的Read()转换为char,然后编写它。

  3. 我们需要看看你的代码......

答案 1 :(得分:0)

磁盘大小 vs 大小

首先,您应该注意磁盘上的大小几乎总是与 Size 值不同,因为磁盘上的大小值反映了已分配的驱动器存储,但 Size 反映了文件的实际长度。

磁盘驱动器将其空间拆分为相同大小的块。例如,如果您的驱动器使用4KB块,那么即使是包含单个字节的最小文件仍将占用磁盘上的4KB,因为这是它可以分配的最小空间。一旦你写出4KB + 1字节,它将分配另一个4KB的存储块,从而使它在磁盘上为8KB。因此,磁盘上的大小始终是4KB的倍数。因此,源文件和目标文件在磁盘上具有相同的大小这一事实并不意味着文件的长度相同。 (不同的驱动器具有不同的块大小,并不总是4KB)。

Size 值是磁盘块中文件数据的实际定义长度。

您的尺寸问题

由于 Size 值不同,这意味着操作系统已保存了不同长度的数据。因此,您的复制例程存在根本问题,而不仅仅是您现在想到的最后一个字节的问题。你的一个文件是3,434字节,另一个是2,008,这是一个很大的区别。你的第一步必须是找出你有这么大差异的原因。

如果您的十六进制比较例程只是查看块数据,那么它会认为它们与比较磁盘块而不是实际文件长度的长度相同。